2012-04-26 3 views
1

Я работаю над системой управления интеллектуальной собственностью, где у меня есть две таблицы в базе данных - торговая марка и дизайн.MySQL условное имя таблицы в JOIN

Тогда у меня есть такая вещь, как оппозиция. Это означает, что если у кого-то есть товарный знак или дизайн, который похож на наших клиентов, менеджер может создать новую оппозицию.

К примеру, у меня есть 3 таблицы:

торговая марка:

id 
name 

дизайн:

id 
name 

oppostion:

id 
name 
object_id 
object_table 

Я не знаю, к какая таблица оппозиция rela Ted, но я должен иметь возможность сделать такой вид запроса:

SELECT id, name, opposition_object.name FROM opposition 
LEFT JOIN (trademark|design) as opposition_object on opposition.object_id = (trademark|design).id 

Во-первых, я думал о хранении имя таблицы object_table столбце таблицы оппозиции, но потом я понял, что я не знаю, будет ли это можно запросить имя таблицы и, во-первых, это отвратительно плохой дизайн.

Но меня тут поразило, и мне ничего не приходит в голову. У кого-нибудь есть идеи, как справиться с этим?

ответ

3

Может быть что-то вроде этого:

SELECT 
    id, 
    name, 
    COALESCE(trademark.name,design.name) AS object_name 
FROM 
    opposition 
    LEFT JOIN trademark 
     on opposition.object_id = trademark.id 
     AND trademark.object_table ='trademark' 
    LEFT JOIN design 
     on opposition.object_id = design.id 
     AND design.object_table ='design' 
+0

Спасибо, это именно то, что я искал! –

+0

@KuH также, сравните производительность с запросом из моего ответа. Я не совсем уверен, но мне кажется, что мой запрос должен быть быстрее, возвращая тот же результат. –

+1

@KuH: проблем нет. Не забудьте проголосовать за ответ, который, по вашему мнению, хорош. Это дает нам теплое нечеткое чувство: P. – Arion

0
SELECT opposition.id, opposition.name, trademark.name AS object_name 
FROM opposition 
LEFT JOIN trademark 
    ON opposition.object_id = trademark.id 
WHERE opposition.object_table = 'trademark' 

UNION 

SELECT opposition.id, opposition.name, design.name AS object_name 
FROM opposition 
LEFT JOIN design 
    ON opposition.object_id = design.id 
WHERE opposition.object_table = 'design' 

Это выдает два запроса: один присоединение к trademark стол и один присоединение design. Затем результаты объединяются в один результирующий набор, используя UNION.

Смежные вопросы