私はこのデータベースを持っています。すべてのテーブルが含まれているわけではありませんが、私の問題では、写真に含まれているもので十分です。
このデータベースは運送会社向けに設計されています。
ということで、予約です。どの予約も複数の住所を持つことができます。これらのタイプは (routing_type: ピックアップ、ストップ、ドロップオフ) です。私の住所は、住所または空港です。
ルーティング テーブル内では、address_id または airport_id のいずれかを使用して、ルーティングのタイプを示します。airport_id が address_id よりも数字の場合は NULL です。
私の booking_routing テーブルには、特定の予約のルーティング タイプと同じ数のエントリがあります。特定の予約に 3 つの住所がある場合、booking_routing には 3 つのエントリがあります (おそらく、ピックアップ、ストップ、ドロップオフ)。通常、必要な住所はピックアップとドロップオフの 2 つだけです。
問題: 乗車場所と降車場所を予約の他のフィールドと同じ行に表示するクエリを作成しようとしました。
例:
Booking_ID Account_ID ... Pick-Up Drop-Off
121 32 1 Main St IAD, AA-322
現在、2行でLEFT JOINを使用してそれらを取得することしかできませんでした。次のように:
Booking_ID Account_ID ... Address_Type 住所
121 32 Pick_up 1 Main St
121 32 Drop-Off IAD、AA-322
SELECT
b.booking_id as ID, a.account_id as Acc_ID,
MAX(CASE WHEN br.routing_type_id = 1 THEN -- 1=pick-up
Concat(ad.address_line1, " ", api.code, " ", aii.code, "-", ap.flight_number) END) as Pick_up,
MAX(CASE WHEN br.routing_type_id = 4 THEN -- 4=drop-off
Concat(ad.address_line1, " ", api.code, " ", aii.code, "-", ap.flight_number) END) as Drop_off
FROM booking b
left JOIN account a ON b.account_id = a.account_id
left join booking_routing br ON b.booking_id = br.booking_id
left join routing r ON br.routing_id = r.routing_id
left join routing_type rt ON br.routing_type_id = rt.routing_type_id
left join address ad ON r.address_id = ad.address_id
left join airport ap ON r.airport_id = ap.airport_id
left join airport_info api ON ap.airport_info_id = api.airport_info_id
left join airline_info aii ON ap.airline_info_id = aii.airline_info_id
group by b.booking_id, a.account_id;