Я нахожу этот запрос немного сложным для объяснения; возможно, есть какая-то краткая формулировка, с которой я не знаком.
TL / DR:
Как задать запрос SQL, чтобы выбрать, какую таблицу присоединить в зависимости от данных исходной таблицы?
У меня есть таблица events
. Каждое событие относится к одному из четырех topics
; Исходные данные были только для одного topic
, поэтому было простое соотношение таблиц 1: 1.
Но теперь клиент хочет расширить события до четырех разных тем;
Итак:
Возможные темы (у каждой своя таблица):
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
) и идентификатор ссылки (reference_id
) в этой таблице.
Я сейчас нахожусь в позиция, где я хочу получить название holidays
/ cruises
/ recruitment
/ fundays
, относящееся к каждому событию . У меня есть идентификатор события, поэтому SQL будет:
SELECT event_name, etc... FROM events WHERE event_id = 1
Но я также хочу получить имя топи c в том же запросе;
Я пытался что-то вроде этого 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
для выбора таблиц для JOIN на основе критериев столбцов, то я предполагаю, что 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!
- Is это возможно?
- Как это можно сделать?
Я смотрел здесь:
Но, похоже, что все это либо не может быть сделано, либо их места находятся в разных столбцах одной таблицы