MySQL условное имя таблицы в JOIN

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

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

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

товарный знак:

id 
name

дизайн:

id
name

oppostion:

id
name
object_id
object_table

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

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

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

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

2 ответа

Решение

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

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'
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,

Другие вопросы по тегам