【问题标题】:SQL JOIN first row with CONCAT_WSSQL JOIN 第一行与 CONCAT_WS
【发布时间】:2015-01-06 05:12:59
【问题描述】:

我只想从我的用户表中引用第一个结果,但我收到以下错误

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1 CONCAT_WS(' ',employeeFirstName,employeeLastName) AS courseAdded FROM vwt_user' at line 6 

我的SQL如下

CREATE OR REPLACE VIEW vwt_courses AS
SELECT tw_tblcourse.*, tw_tblprovider.providerName, CONCAT_WS(' ',vwt_userse.employeeFirstName,vwt_userse.employeeLastName) AS courseEditor, tw_tblprovider.providerAdd1, tw_tblprovider.providerAdd2, u_tbltowns.townName AS providerTown, tw_tblprovider.providerPostCode
FROM tw_tblcourse
JOIN tw_tblprovider ON tw_tblprovider.providerID = tw_tblcourse.courseProviderID
LEFT JOIN u_tbltowns ON u_tbltowns.townID = tw_tblprovider.providerTownID
JOIN vwt_users AS vwt_usersa ON vwt_usersa.userID = (SELECT TOP 1 CONCAT_WS(' ',employeeFirstName,employeeLastName) AS courseAdded FROM vwt_users WHERE userID=tw_tblcourse.courseAddedID)
LEFT JOIN vwt_users AS vwt_userse ON vwt_userse.userID = tw_tblcourse.courseEditedID

我一直在尝试关注SQL Server: How to Join to first row 的答案,但它不起作用,否则我做错了:)

我也试过了: 不适用于 MySQL,所以不起作用

CREATE OR REPLACE VIEW vwt_courses AS
SELECT tw_tblcourse.*, tw_tblprovider.providerName, CONCAT_WS(' ',vwt_usersa.employeeFirstName,vwt_usersa.employeeLastName) AS courseAdded, CONCAT_WS(' ',vwt_userse.employeeFirstName,vwt_userse.employeeLastName) AS courseEditor, tw_tblprovider.providerAdd1, tw_tblprovider.providerAdd2, u_tbltowns.townName AS providerTown, tw_tblprovider.providerPostCode
FROM tw_tblcourse
JOIN tw_tblprovider ON tw_tblprovider.providerID = tw_tblcourse.courseProviderID
LEFT JOIN u_tbltowns ON u_tbltowns.townID = tw_tblprovider.providerTownID
CROSS APPLY (SELECT  TOP 1 vwt_users.employeeFirstName, vwt_users.employeeLastName FROM vwt_users WHERE vwt_users.userID = tw_tblcourse.courseAddedID) vwt_usersa
LEFT JOIN vwt_users AS vwt_userse ON vwt_userse.userID = tw_tblcourse.courseEditedID

尝试 3: 此尝试已被接受,但由于某种原因没有限制

CREATE OR REPLACE VIEW vwt_courses AS
SELECT tw_tblcourse.*, tw_tblprovider.providerName, CONCAT_WS(' ',vwt_usersa.employeeFirstName,vwt_usersa.employeeLastName) AS courseAdded, CONCAT_WS(' ',vwt_userse.employeeFirstName,vwt_userse.employeeLastName) AS courseEditor, tw_tblprovider.providerAdd1, tw_tblprovider.providerAdd2, u_tbltowns.townName AS providerTown, tw_tblprovider.providerPostCode
FROM tw_tblcourse
JOIN tw_tblprovider ON tw_tblprovider.providerID = tw_tblcourse.courseProviderID
LEFT JOIN u_tbltowns ON u_tbltowns.townID = tw_tblprovider.providerTownID
JOIN vwt_users AS vwt_usersa ON vwt_usersa.userID = (SELECT userID FROM vwt_users WHERE userID = tw_tblcourse.courseAddedID LIMIT 1)
LEFT JOIN vwt_users AS vwt_userse ON vwt_userse.userID = (SELECT userID FROM vwt_users WHERE userID = tw_tblcourse.courseEditedID LIMIT 1)

vwt_users 示例:

╔════╦═══════╦══════╦══════╦══════╗
║ ID ║ FIRST ║ LAST ║ COMP ║ LIVE ║
╠════╬═══════╬══════╣══════╣══════╣
║  1 ║ JOHN  ║  DOE ║  1   ║  1   ║
║  1 ║ JOHN  ║  DOE ║  2   ║  1   ║
╚════╩═══════╩══════╩══════╩══════╝ 

实际字段是用户 ID、用户名、员工 ID、名字、姓氏、电子邮件、用户级别、公司 ID、公司名称、用户活动。其中,只有员工(ID、名字和姓氏)和公司(ID 和姓名)详细信息发生变化

【问题讨论】:

    标签: mysql sql join phpmyadmin limit


    【解决方案1】:

    TOP在MySQL中不可用,需要使用LIMIT

     SELECT  vwt_users.employeeFirstName, vwt_users.employeeLastName FROM vwt_users WHERE vwt_users.userID = tw_tblcourse.courseAddedID
     order by
     vwt_users.employeeFirstName,     vwt_users.employeeLastName
     Limit 1
    

    当您加入 vwt_users 时,它多次具有相同的用户 ID,结果将是相同的, 相关子查询为您提供 1 行限制,但这是针对来自 vwt_users 的每个用户 ID(此处重复)。

    一种方法是使用类似于您的尝试 2 的交叉连接并使用 vwt_users 删除连接

    SELECT tw_tblcourse.*,
           tw_tblprovider.providerName, 
           CONCAT_WS(' ',vwt_usersa.employeeFirstName,vwt_usersa.employeeLastName) AS courseAdded,   
           CONCAT_WS(' ',vwt_userse.employeeFirstName,vwt_userse.employeeLastName) AS courseEditor 
           tw_tblprovider.providerAdd1, tw_tblprovider.providerAdd2, u_tbltowns.townName AS providerTown,  
           tw_tblprovider.providerPostCode
    FROM tw_tblcourse
    JOIN tw_tblprovider 
    ON tw_tblprovider.providerID = tw_tblcourse.courseProviderID
    LEFT JOIN u_tbltowns 
    ON u_tbltowns.townID = tw_tblprovider.providerTownID
    CROSS JOIN (SELECT vwt_users.employeeFirstName, vwt_users.employeeLastName FROM vwt_users WHERE userID = tw_tblcourse.courseAddedID LIMIT 1) vwt_usersa
    CROSS JOIN (SELECT vwt_users.employeeFirstName, vwt_users.employeeLastName  FROM vwt_users WHERE userID = tw_tblcourse.courseEditedID LIMIT 1) vwt_userse
    

    【讨论】:

    • @dpDesignz,能不能加点数据,方便验证
    • 我添加了vwt_users 视图中的示例。我假设这就是你的意思? :) 有 10 个字段,但大多数是相同的数据。注意:vwt_users 也是一个视图
    • 不要加入 vwt_users ,从子查询中获取名称并使用它们,加入用户使其返回与该用户 ID 存在的行数一样多的行,将对每个用户 ID 应用限制,当然我会组合,因为我们与用户一起加入,相同的用户 ID 匹配多次
    • 嗯,我的结构是有一个用户 ID,并且可以将多个员工分配给该用户 ID。也许我应该将addedID 和editedID 分配给employeeID 而不是userID
    • 您的编辑给出了以下错误#1349 - View's SELECT contains a subquery in the FROM clause
    【解决方案2】:

    concat_ws() 不是 SQL Server 函数。它是一个 MySQL 函数。您可能可以随心所欲:

    ON vwt_usersa.userID = (SELECT TOP 1 employeeFirstName + ' ' + employeeLastName AS courseAdded
                            FROM vwt_users
                            WHERE userID = tw_tblcourse.courseAddedID)
    

    这可能无法正确处理NULLs。如果这很重要,您需要更多逻辑:

    ON vwt_usersa.userID = (SELECT TOP 1 (case when employeeFirstName is NULl then employeeLastName
                                               when employeeLastName is NULL then emplyeeFirstName
                                               else employeeFirstName + ' ' + employeeLastName
                                          end) AS courseAdded
                            FROM vwt_users
                            WHERE userID = tw_tblcourse.courseAddedID)
    

    【讨论】:

    • 抱歉,这是一个不正确的标签。这是一个 MySQL 服务器
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多