MySQL - 连接和连接

时间:2016-06-08 11:23:57

标签: mysql sql concatenation

有以下3个表格:

  1. 用户(身份证,姓名)
  2. 项目(身份证,姓名)
  3. user_to_project(user_id,project_id)
  4. 每个用户都可以分配到多个项目,并存储在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
    

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

2 个答案:

答案 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表,并保持条件。