有以下3个表格:
每个用户都可以分配到多个项目,并存储在user_to_project表中。我想在一个用逗号分隔的字段中获取用户名和他分配的所有项目。我试过这样的事情:
SELECT
users.id AS 'ID',
users.name AS 'Name',
(SELECT GROUP_CONCAT (projects.name SEPARATOR ', ')
FROM user_to_project
INNER JOIN projects ON (projects.id = user_to_project.project_id)
INNER JOIN users ON (users.id = user_to_project.user_id)) AS 'Projects'
FROM users
它让我在每一行中都分配了不是我想要的项目。如何解决这个问题?
答案 0 :(得分:3)
您可以使用子查询执行此操作,但需要一个关联子句:
SELECT u.id, u.name,
(SELECT GROUP_CONCAT(p.name SEPARATOR ', ')
FROM user_to_project tup INNER JOIN
projects p
ON p.id = utp.project_id
WHERE u.id = utp.user_id
) as Projects
FROM users u;
注意:
INNER JOIN
的版本不同,因为这会保留所有用户,即使是那些没有项目的用户。答案 1 :(得分:0)
我没有看到此相关查询的任何原因,并且您错过了将其与外部查询相关联的条件。您还需要group by子句。
此查询应该为您提供每个ID
的所有项目:
SELECT users.id, users.name ,
GROUP_CONCAT (projects.name SEPARATOR ', ')
FROM user_to_project
INNER JOIN projects ON (projects.id = user_to_project.project_id)
INNER JOIN users ON (users.id = user_to_project.user_id)
GROUP BY users.id,users.name
注意:要使查询正常工作,您只需从内部查询中删除users表,并保持条件。