【问题标题】:Join one table to two separate one-to-many tables将一张表连接到两个单独的一对多表
【发布时间】:2017-11-18 00:33:45
【问题描述】:

我有三个表,如下所示:

projects
| id | name       |
|----|------------|
| 1  | enterprise |
| 2  | discovery  |

widgets
| project_id | name            |
|------------|-----------------|
| 1          | saucer section  |
| 1          | pylons          |
| 2          | spinning saucer |
| 2          | angular pylons  |

sprockets
| project_id | name        |
|------------|-------------|
| 1          | engineering |
| 1          | bridge      |
| 1          | mess        |
| 2          | engineering |
| 2          | bridge      |
| 2          | mess        |

我要写的是一个查询,它给我正好十个结果:基本上是widgetssprockets 中的每一行一个,看起来像这样:

result
| project_name | widget_name     | sprocket_name |
|--------------|-----------------|---------------|
| enterprise   | saucer section  | null          |
| enterprise   | pylons          | null          |
| enterprise   | null            | engineering   |
| enterprise   | null            | bridge        |
| enterprise   | null            | mess          |
| discovery    | spinning saucer | null          |
| discovery    | angular pylons  | null          |
| discovery    | null            | engineering   |
| discovery    | null            | bridge        |
| discovery    | null            | mess          |

相反,我的联接合并返回 12 行。添加 group by 似乎减少了太多。

我尝试了类似以下的方法,但连接数成倍增加:

select
  p.name as project_name,
  w.name as widget_name,
  s.name as sprocket_name
from
  projects as p
left join widgets w on p.id = w.project_id
left join sprockets s on p.id = s.project_id;

answersI'vefound 主要专注于重新设计数据库,但这不是我的选择。 如何编写一个连接以从该数据集中返回上述十行?

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    对每个表使用UNION 的连接。

    SELECT p.name AS project_name, w.name AS widget_name, NULL AS sprocket_name
    FROM projects AS p
    INNER JOIN widgets AS w ON p.id = w.project_id
    
    UNION ALL
    
    SELECT p.name AS project_name, NULL AS widget_name, s.name AS sprocket_name
    FROM projects AS p
    INNER JOIN sprockets AS s ON p.id = s.project_id
    

    【讨论】:

    • 结果是 20 行,其中一些数据似乎与我想要的方式不相关。我错过了什么吗?
    • 糟糕,忘记了ON 子句
    • 如果您将“p”添加到“FROM projects AS p”的第二行,我会接受这个作为答案:)
    猜你喜欢
    • 2023-03-31
    • 2014-05-20
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多