MySQL - 连接和连接

标签 mysql sql concatenation

有以下3个表:

  1. 用户(id,姓名)
  2. 项目(编号、名称)
  3. 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/

相关文章:

Mysql 将前一行的值减去当前行

使用在其他机器上运行的 MySql 的 Java 程序

mysql - 将csv文件导入mysql

.net - 跨不同数据库连接的多个 SQL 事务命令

Gulp Uglify 选项不适用

c - 拆分从套接字接收的字符数组的最佳方法

mysql - 在 MySql 存储过程更新超过一次

sql server 从组中选择第一行

mysql - 如何在 mySQL 中使用 case 编写十二生肖查询

arrays - 将任意数量的数组合并为单个数组?