次のスキーマがあります。
2 つのクエリをかなり簡単に実行できます
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
これにより、予約モデルに適合する と 'revenue_stream_mappings' のすべての組み合わせが得られますchannel mappings
。テーブルの 1 つにのみ一致するものがある場合は Null になります。
他のクエリ
select * from axis_channel join axis_revenue_stream
チャネルと収益源の可能な組み合わせをすべて示します。
私が望むのは、すべての組み合わせを提供するクエリと、その組み合わせが一致する場合の booking_model です。
参加またはサブクエリを試みるたびに、結果が多すぎるか少なすぎるようです。問題は、外部結合が存在する場合に限り、外部結合全体でassignment_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
しかし、さらに軸を追加すると、このクエリは煩雑になります。