MySQL - использование значения столбца для объединения в одном запросе - PullRequest
0 голосов
/ 31 октября 2011

У меня есть три таблицы, которые выглядят примерно так:

Таблица joins

|ID|JOIN_NAME|
 1  persons
 2  companies

Таблица information

|ID|JOIN_ID|
 1  1
 2  2

Таблица information_extra_persons

|ID|INFORMATION_ID|NAME|
 1  1              John

Таблица information_extra_companies

|ID|INFORMATION_ID|NAME|
 1  2              IBM

Как я могу объединить эти таблицы в один SQL? Я пробовал что-то вроде:

SELECT * FROM `information`
INNER JOIN `information_extra_(SELECT `name` FROM `joins` WHERE `id` = `join_id`)`
ON `information_extra_(SELECT `name` FROM `joins` WHERE `id` = `join_id`)`.`information_id` = `information`.`id`

но я не могу заставить его работать. Конечно, это не моя фактическая установка стола, но это тот же принцип. Кто-нибудь знает, как получить всю информацию только в одном SQL?

1 Ответ

3 голосов
/ 31 октября 2011

Это на самом деле четыре таблицы, а не три. Это не просто придирка - похоже, суть вашего вопроса такова: «Как я могу использовать имя таблицы как часть критерия соединения?» (т.е. как можно обрабатывать таблицы information_extra_ как одну таблицу?)

На что ответ: ты не можешь. (Вне динамического SQL.)

В этом конкретном случае следующее должно вернуть то, что, я думаю, вы ищете:

select j.join_name joined_entity,
       case when j.join_name = 'persons' then p.name
            else c.name
       end joined_entity_name
from information i
inner join joins j on i.join_id = j.id
left join information_extra_persons p on i.id = p.information_id
left join information_extra_companies c on i.id = c.information_id

Альтернативно, менее эффективный (но более общий) подход может быть:

select j.join_name joined_entity,
       v.name joined_entity_name
from information i
inner join joins j on i.join_id = j.id
inner join (select 'persons' entity, information_id, name from information_extra_persons
            union all
            select 'companies' entity, information_id, name from information_extra_companies) v
           on i.id = v.information_id and j.join_name = v.entity
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...