MySQL join - выбор таблицы по условию - PullRequest
4 голосов
/ 04 декабря 2010

У меня есть три таблицы table1, table2 и table2.table1.parent_id - это идентификатор записи в table2 или table3, в зависимости от значения table1.parent_type.Теперь я хочу объединить table1 с table2 и table3, в зависимости от значения table1.parent_type.

Это можно сделать с помощью UNION.Но есть ли другой метод?

Это мой текущий запрос

 (SELECT c.*, a.title 
FROM table1 c 
LEFT OUTER JOIN table2 a 
ON c.parent_id = a.id 
WHERE c.parent_type = 0) 
UNION (SELECT c.*, p.title 
FROM table1 c 
LEFT OUTER JOIN table3 p 
ON c.parent_id = p.id 
WHERE c.parent_type = 1) 
ORDER BY id DESC 
LIMIT 10

Обновление : Это другой метод (из ответа Dark Falcon)

SELECT c.*, IF(c.parent_type = 0, a.title, p.title) as title FROM table1 c 
LEFT OUTER JOIN table2 a ON c.parent_id = a.id AND c.parent_type = 0  
LEFT OUTER JOIN table3 p ON c.parent_id = p.id AND c.parent_type = 1 
WHERE a.id IS NOT NULL OR p.id IS NOT NULL ORDER BY id DESC LIMIT 10;

Обновление 2 : я профилировал запросы с помощью профилировщика запросов.Соединение с несколькими таблицами более чем в 100 раз быстрее для всех моих тестовых прогонов.

1 Ответ

4 голосов
/ 04 декабря 2010

Это немного сложно без схемы, но что-то в этом роде должно работать.Обратите внимание, что вы можете поместить любое условие в предложение ON объединения.Почему вы хотите избежать СОЮЗА?

SELECT c.*, a.title FROM
 table1 c
 LEFT OUTER JOIN table2 a
  ON c.parent_id = a.id AND c.parent_type = 0
 LEFT OUTER JOIN table3 p
  ON c.parent_id = p.id AND c.parent_type = 1
WHERE a.id IS NOT NULL OR p.id IS NOT NULL
ORDER BY id DESC LIMIT 10
...