有以下3个表:
- 用户(id,姓名)
- 项目(编号、名称)
- user_to_project (user_id, project_id)
每个用户都可以分配给多个项目,这存储在 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
它让我在每一行中获得所有分配的项目,这不是我想要的。如何解决这个问题?
最佳答案
您可以使用子查询来完成此操作,但您需要一个关联子句:
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
的版本不同,因为这将保留所有用户,即使是那些没有项目的用户。
关于MySQL - 连接和连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37701122/