MySQL: несколько соединений в одном запросе?


121

У меня такой запрос:

SELECT
  dashboard_data.headline,
  dashboard_data.message,
  dashboard_messages.image_id 
FROM dashboard_data
INNER JOIN dashboard_messages
  ON dashboard_message_id = dashboard_messages.id

Итак, я использую INNER JOINи хватаю image_id. Итак, теперь я хочу взять этот image_id и превратить его в images.filenameиз таблицы изображений.

Как я могу добавить это в свой запрос?


Ответы:


209

Вы можете просто добавить еще одно соединение следующим образом:

SELECT dashboard_data.headline, dashboard_data.message, dashboard_messages.image_id, images.filename
FROM dashboard_data 
    INNER JOIN dashboard_messages 
        ON dashboard_message_id = dashboard_messages.id
    INNER JOIN images
        ON dashboard_messages.image_id = images.image_id 

Однако имейте в виду, что, поскольку это сообщение INNER JOIN, если у вас есть сообщение без изображения, вся строка будет пропущена. Если это возможно, вы можете сделать, LEFT OUTER JOINкоторый вернет все сообщения вашей панели инструментов и имя_файла изображения, только если оно существует (в противном случае вы получите ноль)

SELECT dashboard_data.headline, dashboard_data.message, dashboard_messages.image_id, images.filename
FROM dashboard_data 
    INNER JOIN dashboard_messages 
        ON dashboard_message_id = dashboard_messages.id
    LEFT OUTER JOIN images
        ON dashboard_messages.image_id = images.image_id 

19
кто-нибудь знает, как это на самом деле работает? Присоединяется ли второе соединение к результатам первого соединения с таблицей 3, или оно соединяет таблицу 1 с таблицей 3 отдельно? (т. е. соединение таблицы 1 с таблицей 2, а затем соединение таблицы 1 отдельно с таблицей 3, а затем возврат всего этого обратно?) Имеет ли это смысл? Я спрашиваю, потому что я делал такие соединения нескольких таблиц, и иногда получаю неожиданные результаты.
Аарон Валлентин

3
Вот что вам скажет пункт ON. Предложение ON для 2-го соединения (присоединение к третьей таблице) объединяет dashboard_messages с изображениями в поле image_id в каждой таблице. Итак, в данном случае это от A к B, затем от B к C. Это под вашим контролем. Вы можете добраться от А до Б и от А до С, если вам нужно
Джон Биддл

16

Просто добавьте еще одно соединение:

SELECT dashboard_data.headline,
       dashboard_data.message,
       dashboard_messages.image_id,
       images.filename 
FROM dashboard_data 
    INNER JOIN dashboard_messages
            ON dashboard_message_id = dashboard_messages.id 
    INNER JOIN images
            ON dashboard_messages.image_id = images.image_id

9

Я поделился своим опытом использования двух LEFT JOINS в одном SQL-запросе.

У меня есть 3 таблицы:

Таблица 1) Пациент состоит из столбцов PatientID, PatientName.

Таблица 2) Назначение состоит из столбцов AppointmentID, AppointmentDateTime, PatientID, DoctorID.

Таблица 3) Доктор состоит из столбцов DoctorID, DoctorName.


Запрос:

SELECT Patient.patientname, AppointmentDateTime, Doctor.doctorname

FROM Appointment 

LEFT JOIN Doctor ON Appointment.doctorid = Doctor.doctorId  //have doctorId column common

LEFT JOIN Patient ON Appointment.PatientId = Patient.PatientId      //have patientid column common

WHERE Doctor.Doctorname LIKE 'varun%' // setting doctor name by using LIKE

AND Appointment.AppointmentDateTime BETWEEN '1/16/2001' AND '9/9/2014' //comparison b/w dates 

ORDER BY AppointmentDateTime ASC;  // getting data as ascending order

Я написал решение для получения формата даты типа «мм / дд / гг» (под моим именем «VARUN TEJ REDDY»)


3

Множественные объединения в SQL работают за счет постепенного создания производных таблиц одну за другой. См. Эту ссылку, объясняющую процесс:

https://www.interfacett.com/blogs/multiple-joins-work-just-like-single-joins/


2
Всегда указывайте наиболее релевантную часть важной ссылки на случай, если целевой сайт недоступен или постоянно отключен.
Armali
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.