4

イベントの種類に応じて、1つのマスターイベントテーブルを他の3つのマスターイベントテーブルに条件付きで結合しようとしています。selectステートメントは正常に機能し、期待どおりの結果セットを返しますが、JOINステートメントを追加すると、列エイリアスが見つからなかったというエラーが表示されます。

SELECT 
event.type as type,
IF(type = 'birthday', event.target_id, NULL) as birthday_id,
IF(type = 'graduation', event.target_id, NULL) as graduation_id,
IF(type = 'wedding', event.target_id, NULL) as wedding_id
FROM event
LEFT OUTER JOIN birthday ON birthday_id = birthday.id
LEFT OUTER JOIN graduation ON graduation_id = graduation.id
LEFT OUTER JOIN wedding ON wedding_id = wedding.id

このエラーを取得します:

'on句'の不明な列'birthday_id'


更新:わかりましたSebasは、計算結果に参加できないことを示しました。その場合、私のアプローチは無効になります。では、このようなことを行うための正しいアプローチは何ですか?

4

3 に答える 3

5
SELECT 
    event.type as type,
    IF(type = 'birthday', birthday.id, NULL) as birthday_id,
    IF(type = 'graduation', graduation.id, NULL) as graduation_id,
    IF(type = 'wedding', wedding.id, NULL) as wedding_id
FROM 
    event
        LEFT OUTER JOIN birthday b  ON event.target_id = b.id
        LEFT OUTER JOIN graduation g    ON b.id IS NULL AND event.target_id = g.id
        LEFT OUTER JOIN wedding w   ON b.id IS NULL AND g.id IS NULL AND event.target_id = w.id

トリックを行う必要があります、私にフィードバックをください!rgds。

編集:ISNULL条件を参照してください。私はそれをテストしませんでした、mysqlがそれを受け入れるかどうか疑問に思います!はいの場合、ほとんど必要な結合のみが実行されます...

于 2012-05-27T20:18:08.143 に答える
1

すべてのテーブルを同じフィールドevent.target_idで結合する必要があります。特定のデータを表示する必要がある場合は、前にタイプをテストできます。

例:

SELECT 
event.type as type,
IF(type = 'birthday', birthday.birthday_id, NULL) as birthday,
IF(type = 'graduation', graduation.graduation_id, NULL) as graduation,
IF(type = 'wedding', wedding.wedding_id, NULL) as wedding
FROM event
LEFT OUTER JOIN birthday ON birthday_id = event.target_id
LEFT OUTER JOIN graduation ON graduation_id = event.target_id
LEFT OUTER JOIN wedding ON wedding_id = event.target_id

睾丸ではありませんが、これがあなたの疑問を解明するのに役立つことを願っています。

于 2012-05-27T20:18:14.977 に答える
0

Sebasの答えは正しいですが、以前の結合ごとにIS NULLをチェックする条件は必要ありません。ベースの列値を使用して、それを有効にすることができます。私はこれとその動作をテストしました。

SELECT 
    E.type AS type,
    IF(E.type = 'birthday', B.id, NULL) AS birthday_id,
    IF(E.type = 'graduation', G.id, NULL) AS graduation_id,
    IF(E.type = 'wedding', W.id, NULL) AS wedding_id
FROM event E 
    LEFT OUTER JOIN birthday B ON E.type = 'birthday' AND E.target_id = B.id
    LEFT OUTER JOIN graduation G ON E.type = 'graduation' AND E.target_id = G.id
    LEFT OUTER JOIN wedding W ON E.type = 'wedding' AND E.target_id = W.id 
于 2018-04-25T12:24:20.020 に答える