MySQL запрос с JOIN к одной и той же таблице несколько раз

Памятки и заметки Скрипты и Кодинг

 JOIN к одной и той же таблице несколько раз

Имеем две таблицы, в одной у нас названия отделов, в другой для примера список сообщений где в полях message_from и message_to мы указываем от какого к какому отделу мы например пишем. Нам необходимо в выводе потом указать названия этих отделов, но если мы сделаем просто JOIN, мы сможем показать название только одного отдела, а повторном JOIN просто получим сообщение об ошибке.

Таблица 1 (с названиями отделов)
department_list | did | department_name

Содержимое таблицы department_list
| did | department_name
| 1 | первый отдел
| 2 | второй отдел
| 3 | третий отдел

Таблица 2 (с сообщениями)
messages_list | mid | message_from | message_to | etc…

Содержимое таблицы messages_list

| mid | message_from | message_to | etc…

| 1 | 1 | 2 | etc…
| 2 | 3 | 2 | etc…
| 3 | 2 | 3 | etc…

Чтобы вывести названия всех необходимых отделов, сделав повторные запросы к одной и той же таблице к одним и тем же полям несколько раз, мы составим следующий запрос:

Запрос выглядит следующим образом

SELECT b1.department_name as department_name_from, b2.department_name as department_name_to FROM messages_list bo
JOIN department_list b1 ON (bo.message_from = b1.did)
JOIN department_list b2 ON (bo.message_to = b2.did)
УСЛОВИЯ

Мы просто создаем ALIAS’ы для повторяющихся запросов с разными названиями b1.department_name as department_name_from и b2.department_name as department_name_to где b1 и b2 два JOIN запроса к разным столбцам, одной таблицы с выдергиванием названий из другой таблицы столько раз, сколько нам необходимо.

Отображение названия отделов

$row[‘department_name_from’]
$row[‘department_name_to’]

Если нужно вывести дополнительные поля такие как mid или\и did и прочие столбцы то добавляем в выборку:

SELECT b1.department_name as department_name_from, b2.department_name as department_name_to,did,mid FROM messages_list bo
JOIN department_list b1 ON (bo.message_from = b1.did)
JOIN department_list b2 ON (bo.message_to = b2.did)
УСЛОВИЯ

Если в таблице messages_list в столбце message_to к примеру, у вас есть значения NULL, данный запрос эти строки не выведет, необходимо делать LEFT JOIN

SELECT b1.department_name as department_name_from, b2.department_name as department_name_to,did,mid FROM messages_list bo
JOIN department_list b1 ON (bo.message_from = b1.did)
LEFT JOIN department_list b2 ON (bo.message_to = b2.did)
УСЛОВИЯ

Ну а дальше уже условием в PHP коде, обрабатывать показ нужной колонки, через IF ELSE например.

Вы нашли это полезным ?!
Если хотите отблагодарить, угостите чашечкой кофе ( yoomoney or ko-fi or boosty )

Отблагодарить автора

3 минуты на чтение (0) комментарий

Ваш отзыв очень важен для Авторов этого блога. Критика, отзывы, дополнения и уточнения, вопросы, мотивируют развиваться и работать над собой и своими ошибками. Отклик на публикации, позволяет понять полезен ли материал, стоит ли создавать продолжение, дополнять или исправлять уже имеющийся материал, развивая блог и делая его полезнее.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *