2015-05-21 24 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;