私が説明するのは、このクエリは少しトリッキー見つけます。私はと見知らぬよいくつかの簡潔な文言はおそらくあります。
TL / DR:
ソース表データに応じて、JOINをするテーブルを選択するSQLクエリーを設定するには?
私はテーブルを持っていますevents
。各イベントは、4つの1つに関するtopics
。元のデータのみのためであったtopic
ので、単純な1対1のテーブルの関係がありました。
しかし、クライアントは現在、4つのさまざまなトピックにイベントを拡張したいです。
そう:
可能なトピック(それぞれが独自のテーブルを持っています):
holidays | cruises | recruitment | fundays
例:
holidays
テーブル
id | holiday_name | other data....
------------------------------------------------
1 | basic holiday | ..etc..
2 | alpaca training | ..etc..
そして
fundays
テーブル
id | funday_title | other data....
------------------------------------------------
1 | balloons! | ..etc..
2 | seaweed fun! | ..etc..
イベントデータの主なソースは、イベント表です。
イベント表
event_id | reference_id | topic_type (ENUM) | event_name | other data.....
--------------------------------------------------------------
1 | 1 | hol | something | ....
2 | 4 | cruise | some name | ....
3 | 1 | funday | horses! | ....
4 | 2 | hol | whatever | ....
(参照テーブルを有し、各イベントはそうtopic_type
)と参照ID(reference_id
そのテーブル内)。
私は私がのタイトルを取得したい位置に今の私holidays
/ cruises
/ recruitment
/ fundays
それぞれに関連するイベントを。SQLは次のようになりますので、私は、イベントIDを持っています:
SELECT event_name, etc... FROM events WHERE event_id = 1
しかし、私はまた、同じクエリで話題の名前を取得したいです。
私のような何かを試してみました。このQ&Aを:
SELECT events.event_name, other_table.
FROM events
CASE
LEFT JOIN holidays other_table ON events.topic_type = 'hol' AND events.reference_id = other_table.id
WHERE events.event_id = 1
私は動けなくなるところやここにあります。私が参加するテーブルの参照を動的にする方法がわかりません。
私は、出力が到達不能テーブルへの参照になります期待します。私が使用している場合はCASE
、列の基準に基づいて参加することのテーブルを選択するために、私はSELECTは、常に無効である3つの表参照を参照されますので、想定問題を提起します。
私はあることを出力したいと思います:
SELECT events.event_name, events.event_id, other_table.____ as topic_name ....
だから、SQL結果ができること:
EVENT_ID = 1
event_id | event_name | topic_name
------------------------------------------------------------
1 | something | basic holiday
EVENT_ID = 2
event_id | event_name | topic_name
------------------------------------------------------------
2 | some name | cruise Holiday title no.4
EVENT_ID = 3
event_id | event_name | topic_name
------------------------------------------------------------
3 | horses! | balloons!
- これは可能ですか?
- これはどのように行うことができますか?
私はここで見てきました:
しかし、これらはすべて、それが出来ないというか、自分のsitationsは、同じテーブルの別の列であることをいずれかのように見えます
SELECT m.field,
COALESCE(s1.field, s2.field, s3.field, s4.field) AS field,
...
FROM main_table m
LEFT JOIN slave1_table s1 ON ...
LEFT JOIN slave2_table s2 ON ...
LEFT JOIN slave3_table s3 ON ...
LEFT JOIN slave4_table s4 ON ...