2014-11-09 4 views
2

Я желающий только сослаться на первый результате обратно из моей таблицы пользователей, но я получаю следующую ошибкуSQL JOIN первой строки с CONCAT_WS

#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 

My 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 и имя) изменяются

ответ

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, который имеет тот же идентификатор пользователя несколько раз , результаты будут такими же, коррелированный подзапрос получит вам 1 строку с ограничением, но для каждого идентификатора пользователя (здесь дублирует) из vwt_users.

один способ заключается в использовании перекрестного соединения аналогична вашей попытке 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 
+0

@dpDesignz, можете ли вы добавить некоторые данные, поэтому легко проверить – radar

+0

Я добавил пример того, что находится в представлении 'vwt_users'. Я предполагаю, что это вы имели в виду? :) Есть 10 полей, но большинство из них - одни и те же данные. ПРИМЕЧАНИЕ: 'vwt_users' также является видом – dpDesignz

+1

Не присоединяйтесь к vwt_users, получите имена из подзапроса и используйте их, joini g с пользователями заставляет его возвращать столько строк, сколько этот идентификатор пользователя существует, ограничение будет применяться для каждого пользователя Id, конечно, я бы комбо, так как мы присоединяемся к пользователям, те же идентификаторы пользователя совпадают с mtiple times – radar

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) 
+0

Извините, что был неправильно тег. Это сервер MySQL – dpDesignz

Смежные вопросы