首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -连接和连接

MySQL -连接和连接
EN

Stack Overflow用户
提问于 2016-06-08 11:23:57
回答 2查看 67关注 0票数 1

有3个表格:

  1. 用户(id,名称)
  2. 项目(id,名称)
  3. user_to_project (user_id,project_id)

每个用户都可以分配给多个项目,并且存储在user_to_project表中。我想要一个用户名和他分配给的所有项目,在一个字段中用逗号分隔。我试过这样的方法:

代码语言:javascript
复制
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

它让我在每一行中都分配了项目,这不是我想要的。怎么解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-08 11:31:38

您可以使用子查询来完成这一任务,但是您需要一个关联子句:

代码语言:javascript
复制
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的版本不同,因为这将保留所有用户,甚至那些没有项目的用户。
票数 3
EN

Stack Overflow用户

发布于 2016-06-08 11:28:58

我没有看到这个相关查询的任何原因,而且您缺少一个将其与外部查询关联起来的条件。您还需要一个组的子句。

这个查询应该为每个ID提供所有项目:

代码语言:javascript
复制
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表,并保留条件即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37701122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档