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
Другие вопросы по тегам