小编典典

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

sql

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

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

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

我已经尝试过像这样的问答:

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!
  • 这可能吗?
  • 如何才能做到这一点?

阅读 174

收藏
2021-05-16

共1个答案

小编典典

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 …

2021-05-16