Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP使用group_CONCAT或其他方式连接三个表并分组_Php_Sql_Group Concat - Fatal编程技术网

PHP使用group_CONCAT或其他方式连接三个表并分组

PHP使用group_CONCAT或其他方式连接三个表并分组,php,sql,group-concat,Php,Sql,Group Concat,所以我有三张桌子: 工人-id、姓名和其他信息 项目-id、名称和其他信息 工人项目-工人id,项目id 表Workers\u projects存储哪个worker正在哪个项目上工作(按ID) 目标是: 在某些情况下,两名工人将在同一个项目上工作。我想提出两项产出: 项目1-工人1、工人2、工人3 项目2-工人2,工人3 SQL选择第1列中的所有项目,并在第2列中列出处理该项目的每个工作人员 及 工人1-项目1、项目2 工人2-项目5,项目6 SQL选择第1列中的所有工作人员,并在第2列中列出该

所以我有三张桌子:

  • 工人-id、姓名和其他信息
  • 项目-id、名称和其他信息
  • 工人项目-工人id,项目id
  • 表Workers\u projects存储哪个worker正在哪个项目上工作(按ID)

    目标是:

    在某些情况下,两名工人将在同一个项目上工作。我想提出两项产出:

  • 项目1-工人1、工人2、工人3
  • 项目2-工人2,工人3
  • SQL选择第1列中的所有项目,并在第2列中列出处理该项目的每个工作人员

  • 工人1-项目1、项目2
  • 工人2-项目5,项目6
  • SQL选择第1列中的所有工作人员,并在第2列中列出该工作人员正在处理的每个项目

    到目前为止,我得到的是:

    选择p.name、GROUP\u CONCAT(w.name)
    来自作为wp的工人联合会项目
    在wp.project\u id=p.id上以p的形式左键连接项目
    
    以wp.worker_id=w.id的形式左键加入工作人员。您发布的代码看起来非常接近您所需的输出。 这就是你想要的吗

    # Projects with workers
    SELECT p.name AS project, GROUP_CONCAT(w.name SEPARATOR ', ') AS workers
    FROM projects p
    LEFT JOIN workers_projects wp ON (p.id = wp.project_id)
    LEFT JOIN workers w ON (w.id = wp.worker_id)
    GROUP BY p.id
    
    # Workers with projects
    SELECT w.name AS worker, GROUP_CONCAT(p.name SEPARATOR ', ') AS projects
    FROM workers w
    LEFT JOIN workers_projects wp ON (w.id = wp.worker_id)
    LEFT JOIN projects p ON (p.id = wp.project_id)
    GROUP BY w.id
    
    如果您只想显示包含辅助对象的项目,或者类似地,包含辅助对象的项目,可以使用
    内部联接
    ,而不是
    左联接

    下面是一个例子:

    SELECT p.name AS project, GROUP_CONCAT(w.name SEPARATOR ', ') AS workers
    FROM projects p
    INNER JOIN workers_projects wp ON (p.id = wp.project_id)
    INNER JOIN workers w ON (w.id = wp.worker_id)
    GROUP BY p.id
    

    我得到相同的输出。表中有一行。第1列-随机项目,第2列列出所有名称。哦,对不起。更新了我的答案。它丢失了
    groupby
    clausesthave。非常感谢你的帮助。在理解sql命令方面还有很长的路要走。还有一件事,如果你有时间,有些项目没有指派工作人员。有没有办法不在输出中显示这些项目(未分配工人)?是的,只需将联接从
    LEFT
    更改为
    internal
    。请参阅更新的答案<代码>左联接
    s将包括在联接左侧具有值的结果。因此,没有工人的项目将包括在内。然而,
    内部联接
    要求联接两侧都包含结果。