Reputation: 717
I have a query like that:
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
My goal is to get unique u.id
(user_id). Unfortunately, the result show two duplicate u.id
from this multiple join. If I remove the last one join(INNER JOIN roles r ON r.id = mr.role_id
), this query run correctly. But I didn't know why it was wrong if I add this line to my query. The last one join
line is necessary to get the role's name, so I can ignore it. Can someone tell me where I did incorrectly in my query?
Upvotes: 0
Views: 76
Reputation: 1269503
You are missing the fact that users can have multiple roles on a project. Fortunately, MySQL has group_concat()
which can bring the multiple values together:
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;
Upvotes: 1
Reputation: 2542
Use GROUP BY
in your query to get rows with unique user_id
.
Then the updated query will be look like the following.
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
Upvotes: 1