如何使用 LEFT JOIN 连接多个 mySQL 表?

爱和平

桌子 projects

+----+--------+------------+
| id | title  | project_id |
+----+--------+------------+
|  1 | blue   |      12345 |
|  2 | red    |      67890 |
|  3 | yellow |      11111 |
|  4 | rosa   |      22222 |
+----+--------+------------+

桌子 connect

+----+------------+-----------+
| id | project_id | people_id |
+----+------------+-----------+
|  1 |      12345 |         4 |
|  2 |      12345 |         3 |
|  3 |      12345 |         2 |
|  4 |      22222 |         2 |
+----+------------+-----------+

桌子 people

+----+-----------+-----------+----------+
| id | firstname |   name    | position |
+----+-----------+-----------+----------+
|  1 | Diana     | Rose      | singer   |
|  2 | Al        | Capone    | singer   |
|  3 | Barbara   | Streisand | actor    |  
|  4 | Ben       | Harper    | musician |
+----+-----------+-----------+----------+

这是我希望的结果:

+----+---------+--------+----------+----------+
| id | project | singer | musician |  actor   |
+----+---------+--------+----------+----------+
|  1 | blue    | Capone | Harper   | Sreisand |
|  4 | rosa    | Capone |          |          |
+----+---------+--------+----------+----------+

我试图达到这样的结果:

<?php
$pdo = $db->query('
  SELECT *   
  FROM projects 
    LEFT JOIN connect ON projects.project_id=connect.project_id
    LEFT JOIN people ON connect.people_id=people.id;');

while ($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
    echo <td>$row['title']</td>;
    echo "<td>";
    if ($row['position']== "singer"){echo $row['name'];}
    echo "</td>";
    echo "<td>";
    if ($row['position']== "musician"){echo $row['name'];}
    echo "</td>";
    echo "<td>";
    if ($row['position']== "actor"){echo $row['name'];}
    echo "</td>";
}
?> 

但我的结果是:

+----+---------+--------+----------+----------+
| id | project | singer | musician |  actor   |
+----+---------+--------+----------+----------+
|  1 | blue    | Capone |          |          |
|  1 | blue    |        | Harper   |          |
|  1 | blue    |        |          | Sreisand |
|  4 | rosa    | Capone |          |          |
+----+---------+--------+----------+----------+
亚历克斯·布莱克斯

纯SQL解决方案:

SELECT res.id, res.project, 
  GROUP_CONCAT(res.singer) as singer, 
  GROUP_CONCAT(res.musician) as musician, 
  GROUP_CONCAT(res.actor) as actor
FROM (
  SELECT prj.id as id, prj.title as project, 
    IF(ppl.position = 'singer', ppl.name, null) as singer ,
    IF(ppl.position = 'musician', ppl.name, null) as musician,
    IF(ppl.position = 'actor', ppl.name, null) as actor
    FROM projects prj
      LEFT JOIN connect cnt ON prj.project_id=cnt.project_id
      LEFT JOIN people ppl ON cnt.people_id=ppl.id
) res
GROUP BY 1
HAVING singer IS NOT NULL OR musician IS NOT NULL OR actor IS NOT NULL
ORDER BY 1

如果你使用这个查询,php循环可以像这样简单

while ($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
    echo "<td>{$row['project']}</td><td>{$row['singer']}</td><td>{$row['musician']}</td><td>{$row['actor']}</td>";
}

该查询按 project.id 对所有人进行分组并连接姓名。子查询为每个位置设置名称。没有任何人的项目被过滤掉。使用inner join以下方法可以更有效地实现相同的结果

SELECT res.id, res.project, 
  GROUP_CONCAT(res.singer) as singer, 
  GROUP_CONCAT(res.musician) as musician, 
  GROUP_CONCAT(res.actor) as actor
FROM (
  SELECT prj.id as id, prj.title as project, 
    IF(ppl.position = 'singer', ppl.name, null) as singer ,
    IF(ppl.position = 'musician', ppl.name, null) as musician,
    IF(ppl.position = 'actor', ppl.name, null) as actor
    FROM projects prj
      INNER JOIN connect cnt ON prj.project_id=cnt.project_id
      INNER JOIN people ppl ON cnt.people_id=ppl.id
) res
GROUP BY 1
ORDER BY 1

但OPleft join明确询问

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL LEFT JOIN无法使用多个表

来自分类Dev

MySQL从多个表与LEFT JOIN多个

来自分类Dev

如何从LEFT JOIN MySQL表调用结果

来自分类Dev

如何连接来自mysql中两个不同表的数据(LEFT JOIN)?

来自分类Dev

MySQL LEFT JOIN Count列连接3个表

来自分类Dev

MySQL-如何改善使用多个LEFT JOIN的复杂查询

来自分类Dev

表的GROUP BY在使用LEFT JOIN的MySQL中返回错误计数

来自分类Dev

使用LEFT JOIN和History表的MySQL查询的正确结果

来自分类Dev

MySQL-如何使用(LEFT)JOIN通过一个表将两个表连接在一起?

来自分类Dev

存在null时如何查询多个Left Join表

来自分类Dev

使用LEFT JOIN和UNION合并多个表

来自分类Dev

MYSQL 使用 join 查询多个表

来自分类Dev

MySql LEFT连接多个具有相同ID或名称的表

来自分类Dev

MySql LEFT连接多个具有相同ID或名称的表

来自分类Dev

多个表中的多个 LEFT JOIN

来自分类Dev

Mysql Left join避免重复表

来自分类Dev

如何优化多个LEFT JOIN

来自分类Dev

mysql LEFT JOIN 不像左连接

来自分类Dev

在Linq中,Complex通过多个表和LEFT OUTER JOIN连接

来自分类Dev

MySQL多个LEFT JOIN返回重复的行

来自分类Dev

我似乎无法使用LEFT JOIN在MySQL中合并2个表

来自分类Dev

MYSQL合并两个表中的两列,仍然使用LEFT JOIN

来自分类Dev

MySQL JOIN 3表使用多个列/键

来自分类Dev

在MySQL中使用JOIN从多个表中删除行

来自分类Dev

如何使用SQLAlchemy更改LEFT JOIN子句中的表顺序

来自分类Dev

使用 MySQL,如何使用 Left Join 记录计算 MEDIAN?

来自分类Dev

使用Left Outer Join-PDO从多个表中获取数据

来自分类Dev

mySQL LEFT JOIN和COUNT表中出现的次数

来自分类Dev

mysql LEFT JOIN与其他表的条件

Related 相关文章

热门标签

归档