我有一個相當復雜的 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 表)
非常感謝您的每一個提示!
uj5u.com熱心網友回復:
使用LEFT JOIN. 當您sink_type_b使用 a與表連接時JOIN,所有nodes非型別的行都b將從結果中洗掉。UsingLEFT JOIN允許您回傳連接左側的所有行。
sa.name將NULL當這是型別B的接收器,和sb.name將是NULLA型的一個接收器。
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';
uj5u.com熱心網友回復:
如果有一天有人用谷歌搜索:雖然它以某種方式與左連接一起作業,但結果不是最佳的,比如
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315245.html
