MySQL - ПРИСОЕДИНЯЙТЕСЬ К ИЛИ b
Допустим, у меня есть TABLE a
в котором COLUMN data
тот, к которому можно присоединиться для 2 других таблиц (TABLE b
а также TABLE c
) потому что я хочу получить COLUMN info
в b
или же c
,
Дело в том a.data
будет соответствовать только с b.data
или только с c.data
,
- Как я могу получить
b.info
или жеc.info
основанный наa
?
Как далеко я попробовал:
После многих попыток с явно неправильным синтаксисом лучшее, что я сделал, было в 2 запросах:
SELECT b.info FROM a INNER JOIN b ON a.data = b.data
SELECT c.info FROM a INNER JOIN c ON a.data = c.data
Я хотел бы добиться чего-то, что могло бы выглядеть так:
SELECT alias.info FROM a INNER JOIN (b OR c) AS alias ON a.data = alias.data
Почему я хочу сделать это
На самом деле я могу получить нужные данные и работать с ними с помощью PHP. Но вместо хорошего запроса я делаю огромный процесс (не связанный с моим вопросом), и загрузка страницы занимает слишком много времени.
3 ответа
Вы можете оставить присоединиться к обоим b
а также c
таблицы, а затем использовать в зависимости от того, что info
поле не NULL
:
select coalesce(b.info, c.info) info
from a
left join b on a.data = b.data
left join c on a.data = c.data
Попробуйте что-то вроде этого:
SELECT IFNULL(b.info,c.info) AS info
FROM a
LEFT JOIN b ON a.data = b.data
LEFT JOIN c ON a.data = c.data
Если data
гарантированно будет УНИКАЛЬНЫМ в таблицах b
а также c
Мы можем использовать внешнее соединение, чтобы попытаться получить совпадающую строку из каждой таблицы, а затем использовать выражение в списке SELECT, чтобы проверить, получили ли мы совпадающую строку. Например:
SELECT a.data
, IF(b.data IS NULL,IF(c.data IS NULL,NULL,'c'),'b') AS info_src
, IF(b.data IS NULL,c.info,b.info) AS b_or_c_info
FROM a
LEFT
JOIN b
ON b.data = a.data
LEFT
JOIN c
ON c.data = a.data
Если мы найдем подходящую строку в b
, затем b.data
гарантированно не NULL. Мы знаем, что значение не NULL, потому что оно удовлетворяет равенству (=
) сравнение.
Обратите внимание, что IF
это специфичный для MySQL синтаксис. Более портативная версия, соответствующая стандартам ANSI
CASE
WHEN b.data IS NULL
THEN c.info
ELSE b.info
END AS b_or_c_info