0
我有以下架構。笛卡爾連接多重外連接到公共根
我可以運行兩個查詢相當簡單
select * from booking_model_assignment
join booking_model on booking_model_assignment.booking_model_id = booking_model.id
left outer join axis_channel_mappings on bmi_id = axis_channel_mappings.assignment_id
left outer join axis_revenue_stream_mappings on bmi_id = axis_revenue_stream_mappings.assignment_id
這會給我所有的channel mappings
「revenue_stream_mappings」,這適合預訂模式,與零組合以及如果有其中一個僅在其中一個表中匹配。
的其他查詢
select * from axis_channel join axis_revenue_stream
給出的所有信道和收入流的可能的組合。
我想要的是一個查詢,它會給出所有的組合,而booking_model如果組合匹配。
任何時候我嘗試加入或子查詢我似乎得到太多,或太少的結果。我認爲問題在於我希望assign_id匹配外連接,但只有在有外連接的情況下。
模式的佈局是這樣的,所以可以添加新的軸和擬合模型到組合中,所以如果有更簡單的方法來實現這一點,我可以改變模式。
編輯
我有一個基於Eggyal的答案部分解決方案,但它是不可擴展。
SELECT c.*, r.*, GROUP_CONCAT(a.bmi_id), GROUP_CONCAT(b.name) AS booking_models
FROM axis_channel c
CROSS JOIN axis_revenue_stream r
LEFT JOIN axis_channel_mappings cm ON cm.channel_id = c.id
LEFT JOIN axis_revenue_stream_mappings rm ON rm.revenue_stream_id = r.id
LEFT JOIN booking_model_assignment a ON (a.bmi_id = cm.assignment_id
AND a.bmi_id = rm.assignment_id)
OR (a.bmi_id = cm.assignment_id
AND rm.assignment_id IS NULL)
OR (cm.assignment_id IS NULL
AND a.bmi_id = cm.assignment_id)
LEFT JOIN booking_model b ON b.id = a.booking_model_id
GROUP BY c.id, r.id
但是,如果我要添加更多的軸,這個查詢將變得繁瑣。
謝謝,那裏有幾個有趣的提示。然而它並不完美。它只會查找在axis_revenue_stream_mappings和axis_channel_mappings中設置了分配的情況。我需要它既可以是桌面,也可以是兩者。因此,如果設置了收入流,但不是渠道,它將應用於具有該收入流的所有渠道。 –
@JeremyFrench:那麼您確實需要將'AND'換成'OR'? – eggyal
選擇太多,如果我有'預訂模型'b是渠道a和'revenue_stream'X它將選擇所有組合。我有一個基於你的不可擴展的解決方案,我將在問題中發佈。 –