我想仅从我的用户表中引用第一个结果,但我收到以下错误
#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和姓名)详细信息发生变化
答案 0 :(得分:1)
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)
答案 1 :(得分: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