首页 > 解决方案 > mysql根据值加入不同的表

问题描述

我有一个相当复杂的mysql问题。我有一张这样的桌子:

表关系

所以我想根据 sink_node_type 的值将第二个表加入到不同的其他表中。结果应该是这样的

project.name sink_type_a.name sink_type_b.name。

我试过类似的东西:

select p.name, sa.name, sb.name
from project p
join node n on p.id = n.project_id
join sink_type_a sa on n.sink_id = sa.id and n.sink_type = 'a'
join sink_type_b sb on n.sink_id = sb.id and n.sink_type = 'b';

但是,虽然它只适用于一个 sink_type 表的连接,但如果我同时尝试这两个表,结果集是空的。似乎“和”子句被同时考虑并因此相互排斥?有没有办法进行这样的加入?(实际上我有 6 个 sink_type 表)

非常感谢您的每一个提示!

标签: mysqljoin

解决方案


使用LEFT JOIN. sink_type_b当您使用 a与表连接时,所有非类型的JOIN行都将从结果中删除。使用允许您返回连接左侧的所有行。 将是当这是 b 类型的接收器时,并且将用于 a 类型的接收器。nodesbLEFT JOINsa.nameNULLsb.nameNULL

SELECT p.name, sa.name, sb.name
FROM project p
JOIN node n ON p.id = n.project_id
LEFT JOIN sink_type_a sa ON n.sink_id = sa.id AND n.sink_type = 'a'
LEFT JOIN sink_type_b sb ON n.sink_id = sb.id AND n.sink_type = 'b';

推荐阅读