【问题标题】:PHP Join three tables and group using GROUP_CONCAT or other wayPHP使用GROUP_CONCAT或其他方式加入三个表和组
【发布时间】:2017-09-23 04:01:10
【问题描述】:

所以我有三张桌子:

  1. 工人 - 身份证、姓名和其他信息
  2. 项目 - ID、名称和其他信息
  3. Workers_projects - worker_id、project_id

Table Workers_projects 存储哪个工人正在处理哪个项目(按 id)

目标:

在某些情况下,几个工人将从事同一个项目。我想做两个输出:

  1. 项目 1 - 工人 1、工人 2、工人 3
  2. 项目 2 - 工人 2,工人 3。

SQL 选择第 1 列中的所有项目,并在第 2 列中列出正在处理它的每个工作人员。

  1. 工人 1 - 项目 1、项目 2;
  2. 工人 2 - 项目 5,项目 6。

SQL 选择第 1 列中的所有工作人员,并在第 2 列中列出工作人员正在处理的每个项目。

到目前为止我得到了什么:

SELECT p.name, GROUP_CONCAT(w.name)

FROM workers_projects as wp 

LEFT JOIN projects as p ON wp.project_id=p.id

LEFT JOIN workers as w ON wp.worker_id=w.id

我做什么 - 它需要随机项目,然后列出所有工人.. 我对 SQL 很陌生,因此感谢您提供任何帮助。

谢谢!

【问题讨论】:

    标签: php sql group-concat


    【解决方案1】:

    您发布的代码看起来非常接近您想要的输出。 这就是你所追求的吗?

    # 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
    

    如果您只想显示带有工作人员的项目,或者同样显示带有项目的工作人员,您可以使用INNER JOIN 而不是LEFT JOIN

    这是一个例子:

    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 行。第 1 列 - 随机项目,第 2 列列出所有名称。
    • 糟糕,抱歉。更新了我的答案。它缺少GROUP BY 子句
    • 做到了。非常感谢你的帮助。在理解 sql 命令方面还有很长的路要走。还有一件小事,如果你有时间,有些项目没有分配给他们的工人。有没有办法在输出中完全不显示这些项目(没有分配工人)?
    • 是的,只需将您的加入从 LEFT 更改为 INNER。请参阅更新的答案。 LEFT JOINs 将包含在联接左侧具有值的结果。因此将包括没有工人的项目。而INNER JOIN 要求包含连接两侧的结果。
    猜你喜欢
    • 2019-03-09
    • 2012-06-12
    • 2013-02-02
    • 2019-07-17
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多