2013-10-30 35 views
0

我有以下架構。笛卡爾連接多重外連接到公共根

Schema Picture

我可以運行兩個查詢相當簡單

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 

但是,如果我要添加更多的軸,這個查詢將變得繁瑣。

回答

1
SELECT  c.*, r.*, 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 
    LEFT JOIN booking_model    b ON b.id = a.booking_model_id 
GROUP BY  c.id, r.id 
+0

謝謝,那裏有幾個有趣的提示。然而它並不完美。它只會查找在axis_revenue_stream_mappings和axis_channel_mappings中設置了分配的情況。我需要它既可以是桌面,也可以是兩者。因此,如果設置了收入流,但不是渠道,它將應用於具有該收入流的所有渠道。 –

+0

@JeremyFrench:那麼您確實需要將'AND'換成'OR'? – eggyal

+0

選擇太多,如果我有'預訂模型'b是渠道a和'revenue_stream'X它將選擇所有組合。我有一個基於你的不可擴展的解決方案,我將在問題中發佈。 –