#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
, поскольку пара, с которой я работал, содержала разное количество столбцов; уточнение, о котором я не знал, которое я должен был сделать изначально. Оба ответа превосходны и проясняют важный контекст, поэтому я проголосовал за ваш. Спасибо!