2015-05-21 3 views
0

У меня есть запрос вроде этого:Выберите отчетливый не работает правильно (MySQL)

SELECT DISTINCT r.name AS role, r.id AS role_id, u.id AS user_id, concat(u.firstname, '', u.lastname) AS name 
FROM users u 
INNER JOIN members m ON u.id = m.user_id 
INNER JOIN member_roles mr ON m.id = mr.member_id 
INNER JOIN roles r ON r.id = mr.role_id 
WHERE m.project_id =11 

Моя цель получить уникальный u.id (user_id). К сожалению, результат показывает два дубликата u.id из этого множественного соединения. Если я удалю последнее соединение (INNER JOIN roles r ON r.id = mr.role_id), этот запрос будет выполнен правильно. Но я не знал, почему это было неправильно, если я добавлю эту строку в свой запрос. Последняя строка join необходима, чтобы получить имя роли, поэтому я могу ее игнорировать. Может кто-нибудь сказать мне, где я сделал неправильно в моем запросе?

+4

целых значения SETof вернулись уникален, не только первый один –

+0

Дайте нам образец данных и ожидаемый результат через sqlfiddle. – user4035

+0

Если у пользователя несколько ролей, что вы хотите вернуть запрос? –

ответ

1

В вашем запросе используйте GROUP BY, чтобы получить строки с уникальными user_id.

Затем обновленный запрос будет выглядеть следующим образом.

SELECT DISTINCT r.name AS role, r.id AS role_id, u.id AS user_id, 
concat(u.firstname, '', u.lastname) AS name 
FROM users u 
INNER JOIN members m ON u.id = m.user_id 
INNER JOIN member_roles mr ON m.id = mr.member_id 
INNER JOIN roles r ON r.id = mr.role_id 
WHERE m.project_id =11 GROUP BY user_id 
+0

Это сработало для меня, огромное спасибо! – DinhNgocHien

1

Вам не хватает того, что пользователи могут иметь несколько ролей в проекте. К счастью, MySQL имеет group_concat(), который может принести несколько значений вместе:

SELECT u.id AS user_id, concat(u.firstname, '', u.lastname) AS name, 
     GROUP_CONCAT(r.name) as roles, 
     GROUP_CONCAT(r.id) as role_ids 
FROM users u INNER JOIN 
    members m 
    ON u.id = m.user_id INNER JOIN 
    member_roles mr ON m.id = mr.member_id INNER JOIN 
    roles r 
    ON r.id = mr.role_id 
WHERE m.project_id = 11 
GROUP BY u.id; 
Смежные вопросы