MySQLはジョイン:ソース表データに基づいてから参加するテーブルが選んだの

マーティン:

私が説明するのは、このクエリは少しトリッキー見つけます。私はと見知らぬよいくつかの簡潔な文言はおそらくあります。

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 ...

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=6147&siteId=1