Кілька 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-го з'єднання (приєднання до третьої таблиці) приєднується до інформаційної панелі_повідомлень до зображень у полі image_id у кожній таблиці. Отже, у цьому випадку це від A до B, потім від B до C. Це під вашим контролем. Ви можете зробити це від A до B і від A до 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

Я поділився своїм досвідом використання двох лівих приєднань в одному SQL-запиті.

У мене 3 таблиці:

Таблиця 1) Пацієнт складається зі стовпців PatientID, PatientName

Таблиця 2) Призначення складається з стовпців AptribuIDID, 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

Я написав рішення, щоб отримати формат дати типу "mm / dd / yy" (під моїм іменем "VARUN TEJ REDDY")


3

Багатокористування приєднується до роботи SQL шляхом поступового створення похідних таблиць одна за одною. Дивіться це посилання, що пояснює процес:

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


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