ВЫБЕРИТЕ одни и те же данные из любой из двух таблиц

#mysql #sql #join #mariadb

#mysql #sql #Присоединиться #mariadb

Вопрос:

Мне нужно немного сэкономить время. Некоторые сотрудники являются частью первой команды, а некоторые — частью второй команды. Мне нужно отобразить простую таблицу того, кто и когда вошел в систему, а также некоторую другую базовую информацию.

Если обе таблицы team1 и team2 имеют одинаковые столбцы ( first_name , last_name и date ), хотя абсолютно гарантировано, что только одна из этих таблиц будет возвращать данные в строке, как мне избежать использования кучи псевдонимов ( first_name AS team1_first_name ) и просто всегда возвращать SQL first_name ?

Пример запроса:

 SELECT *
FROM associates AS ac
LEFT JOIN team1 AS t1 ON (t1.id = ac.team1) 
LEFT JOIN team2 AS t2 ON (t2.id = ac.team2) 
ORDER BY ac.date DESC LIMIT 100;
  

Комментарии:

1. Я думаю, вы можете использовать объединение с distinct . И когда вы создаете левое соединение с team2, вам нужно изменить «вкл» (t2.id = ac.team2).

2. associates У вас есть только 1 внешний ключ team1 для обеих таблиц или это опечатка?

3. @evilGenius Я займусь этим.

4. @forpas Я подумал, что упущу что-то незначительное, опечатку.

5. @GordonLinoff уже получил рабочий ответ, тем не менее, спасибо. В основном SELECT одни и те же данные / столбцы из двух разных таблиц.

Ответ №1:

Поскольку одно из t1.first_name и t2.first_name равно нулю, а другое нет,
вы можете использовать coalesce() в инструкции select следующим образом:

 select
  coalesce(t1.first_name, t2.first_name) first_name,
  coalesce(t1.last_name, t2.last_name) last_name,
  .............................................
  

Ответ №2:

Если вы не хотите вводить все столбцы, а сотрудники входят только в одну команду, вы можете union таблицы перед join :

 SELECT a.*, t.*
FROM associates a JOIN
     ((SELECT t1.* FROM team1 t1) UNION ALL
      (SELECT t2.* FROM team2 t2)
     ) t
     ON t.id IN (ac.team1, ac.team2)
ORDER BY a.date DESC
LIMIT 100;
  

Комментарии:

1. @John . , , Это отличается от другого ответа. В частности, это делает именно то, что запрашивает ваш вопрос — «как мне избежать использования множества псевдонимов».

2. Правда, к сожалению, не каждая пара таблиц может UNION ALL , поскольку пара, с которой я работал, содержала разное количество столбцов; уточнение, о котором я не знал, которое я должен был сделать изначально. Оба ответа превосходны и проясняют важный контекст, поэтому я проголосовал за ваш. Спасибо!