MySQL联接:根据源表数据选择要从哪个表联接

问题描述 投票:0回答:1

我发现这个查询很难解释;我可能不熟悉某些简洁的用语。

TL / DR:

如何设置SQL查询以根据源表数据选择要联接的表?

我有一个events的表。每个事件与四个topics之一相关;原始数据仅包含一个topic,简单的一对一表关系也是如此。

但是客户现在希望将事件扩展到四个不同的主题;

所以:


可能的主题(每个主题都有自己的表):

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的标题。我有事件ID,因此SQL为:

SELECT event_name, etc... FROM events WHERE event_id = 1 

但是我也想在同一查询中检索主题的名称;

我尝试过类似this 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!
  • 这可能吗?
  • 如何完成?

我看过这里:

但是这些似乎都是无法完成,或者它们的位置是同一张桌子的不同列

mysql join
1个回答
0
投票
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 ...
© www.soinside.com 2019 - 2024. All rights reserved.