我发现这个查询很难解释。我可能不熟悉某些简洁的用语。
TL / DR:
我有一张表events。每个事件涉及四个之一topics; 原始数据仅用于一个,topic因此是简单的一对一表关系。
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)。
topic_type
reference_id
我现在是在一个位置,我想获得的标题holidays/ cruises/ recruitment/fundays与每个 事件 。我有事件ID,因此SQL将是:
cruises
recruitment
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个无效的表引用,因此会引起问题。
CASE
我希望输出为:
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!
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 …