【问题标题】:mysql join to different tables depending on valuemysql根据值加入不同的表
【发布时间】:2021-09-29 08:40:12
【问题描述】:

我有一个相当复杂的 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 表)

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

【问题讨论】:

  • 请use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。
  • 这是一个常见问题解答。请在考虑发布之前阅读手册和谷歌任何错误消息和许多清晰、简洁和准确的问题/问题/目标的措辞,带有和不带有您的特定名称/字符串/数字、“site:stackoverflow.com”和标签;阅读许多答案。反映你的研究。请参阅How to Ask、Help center 和投票箭头鼠标悬停文本。如果您发布问题,请使用一个措辞作为标题。

标签: mysql join


【解决方案1】:

使用LEFT JOIN。当您使用JOIN 加入表sink_type_b 时,所有nodes 中不属于b 类型的行都将从结果中删除。使用LEFT JOIN 允许您返回连接左侧的所有行。 当这是 b 类型的接收器时,sa.name 将是 NULL,而对于 a 类型的接收器,sb.name 将是 NULL。

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';

【讨论】:

  • @anja123 你接受了我的回答然后你没有接受,并删除你的评论。有什么问题吗?
  • 嗨,对不起,我认为它有效,但意识到它错误地有效,修正了我的错误,现在它真的有效了 :) 抱歉造成混乱。但我想我现在对连接有了更多的了解。所以非常感谢!!
【解决方案2】:

万一有一天有人在谷歌上搜索:虽然它以某种方式与左连接一起工作,但结果并不是最优的,比如

Project.name sink_type_a.name sink_type_b.name
    1          something
    1                            someotherthing
    2          something 
    2                            someotherthing

为了在一行中获取一个项目的所有内容,我最终使用了子查询:

Select tab_a.pname, tab_a.sink_a, tab_b.sink_b from
(select p.name as "pname", sa.name as "sink_a" from project p join nodes n on p.id = project_id and n.sink_type = 'a' left join sink_type_a sa on n.sink_id = sa.id) tab_a full join
(select p.name as "pname", sb.name as "sink_b" from project p join nodes n on p.id = project_id and n.sink_type = 'a' left join sink_type_b sb on n.sink_id = sb.id) tab_b on tab_a.pname = tab_b.pname;

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多