MySQL-连接和连接

MySQL-连接和连接,mysql,sql,concatenation,Mysql,Sql,Concatenation,有以下3个表格: 用户(id、名称) 项目(id、名称) 用户到项目(用户id,项目id) 每个用户都可以被分配到多个项目,并存储在“用户到项目”表中。我想在一个用逗号分隔的字段中获得一个用户名和他分配给的所有项目。我试过这样的方法: SELECT users.id AS 'ID', users.name AS 'Name', (SELECT GROUP_CONCAT (projects.name SEPARATOR ', ') FROM user_to_project INNER J

有以下3个表格:

  • 用户(id、名称)
  • 项目(id、名称)
  • 用户到项目(用户id,项目id)
  • 每个用户都可以被分配到多个项目,并存储在“用户到项目”表中。我想在一个用逗号分隔的字段中获得一个用户名和他分配给的所有项目。我试过这样的方法:

    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
    

    它让我在每一行分配的所有项目,这不是我想要的。如何修复此问题?

    我没有看到此关联查询的任何原因,并且您在内部缺少将其与外部查询关联的条件。您还需要一个GROUPBY子句

    此查询应为您提供每个
    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表,并保留条件。

    可以使用子查询执行此操作,但需要一个关联子句:

    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;
    
    注:

    • 使用表别名。它们使查询更易于编写和阅读
    • 不要对列别名使用单引号。仅对字符串和列名使用单引号(列别名不需要任何转义字符)
    • 这与使用
      内部联接的版本不同,因为这将保留所有用户,即使是没有项目的用户

    为了每个用户id获得一个结果行,您必须使用
    按用户id分组
    来聚合记录。这不是唯一的问题,我不明白如果没有与外部查询的关系条件,这是如何工作的,应该抛出一个错误
    多行。
    @ThorstenKettner@sagi:你说得对,这不是唯一的错误,但它是从以下内容开始的:-)子查询只返回一个值:所有记录上的所有项目的合并。谁总是投我的反对票来选择正确的答案?!你经常这样吗?一、 我也很惊讶你投了反对票。毫无意义。(顺便说一句,你的问题中有太多的右括号。戈登在他的回答中指出别名上使用了错误类型的引号,这是正确的。但无论如何,你的答案是好的!)是的,我在那里有错别字:S。是的,不多,但足以让我怀疑和生气(今天的第二个)@索斯滕克特纳