2016-09-13 3 views
0

Я пытаюсь присоединиться к некоторым таблицам с запросом, как показано ниже. Потому что я хочу получить c.name в идеале, на что ссылается таблица b. Если таблица b не имеет строк в результирующем наборе или строка b не ссылается на c, то просто получите имя c.name, на которое ссылается таблица.Заказ предложений левого объединения

SELECT a.*, c.name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON (b.c_id IS NOT NULL AND b.c_id = c.id) OR a.c_id = c.id 

Однако MySQL всегда присоединения C с a.c_id = c.id и получать меньше благоприятствования c.name. Можно ли это избежать, или mySQL пытается получить полный набор результатов как можно быстрее?

+0

У вас есть несколько определений таблиц (как создавать операторы таблицы), тестовые данные (как заявления вставки) и ожидаемый результат (как-то легко проверить). Я действительно хочу проверить ваш запрос, но не хочу тратить время на создание таблиц и тестовых данных. Я могу быстро выполнить их в своей SQL IDE. Считаете ли вы использование http://sqlfiddle.com? –

ответ

0

Я думаю, что это должно помочь:

SELECT a.*, c.name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON c.id = COALESCE(b.c_id, a.c_id) 

Когда b.c_id является NULL, будет использоваться затем a.c_id. В противном случае будет использоваться b.c_id.

Это не скорость. OR предоставит вам все возможные строки результатов, включая как b.c_id, так и a.c_id сопоставления для каждой строки в a.

Если вы не знакомы с COALESCE(), длинная форма этого почти такая же, как ваш запрос, но с использованием IF() вместо OR.

SELECT a.*, c.name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON IF(b.c_id IS NOT NULL, b.c_id = c.id, a.c_id = c.id) 
0

Попробуйте это может помочь:

SELECT a.*, c.name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON (b.c_id IS NOT NULL OR b.c_id = c.id) OR a.c_id = c.id 
+0

Это даст экспоненциальное количество матчей. Каждая строка в 'b', которая не является' NULL', будет соответствовать каждой строке в 'c'. – ebyrob

+0

Просто удалите b.c_id iS NOT NULL, если он не хочет – Minh

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