¿MySQL Multiple Joins en una consulta?

121

Tengo la siguiente consulta:

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

Entonces estoy usando un INNER JOINy agarrando el image_id. Así que ahora quiero tomar ese image_id y convertirlo en images.filenamede la tabla de imágenes.

¿Cómo puedo agregar eso a mi consulta?

Dibujó
fuente

Respuestas:

209

Simplemente puede agregar otra combinación como esta:

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 

Sin embargo, tenga en cuenta que, debido a que es un INNER JOINmensaje, si tiene un mensaje sin imagen, se omitirá toda la fila. Si esta es una posibilidad, es posible que desee hacer una LEFT OUTER JOINque devolverá todos los mensajes de su panel y un nombre de archivo de imagen solo si existe uno (de lo contrario, obtendrá un nulo)

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 
Mago del código
fuente
19
¿Alguien sabe cómo funciona esto realmente? ¿La segunda combinación une los resultados de la primera combinación con la tabla 3, o está uniendo la tabla 1 con la tabla 3 por separado? (es decir, unir la tabla 1 con la tabla 2, y luego unir la tabla 1 por separado con la tabla 3, y luego devolverlo todo) ¿Tiene sentido? Lo pregunto porque he estado haciendo uniones de múltiples tablas como esta y, a veces, obtengo resultados inesperados.
Aaron Wallentine
3
Eso es lo que le dirá la cláusula ON. La cláusula ON para la segunda combinación (unirse a la tercera tabla) es unir dashboard_messages con imágenes en el campo image_id en cada tabla. Entonces, en este caso es A a B, luego B a C. Está bajo su control. Podrías hacerlo de A a B y de A a C si lo necesitas
John Biddle
16

Simplemente agregue otra combinación:

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
Brian Driscoll
fuente
9

Compartí mi experiencia de usar dos LEFT JOINS en una sola consulta SQL.

Tengo 3 mesas:

Tabla 1) El paciente consta de las columnas PatientID, PatientName

Tabla 2) La cita consta de las columnas AppointmentID, AppointmentDateTime, PatientID, DoctorID

Tabla 3) Doctor consta de columnas DoctorID, DoctorName


Consulta:

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

Escribí la solución para obtener un formato de fecha como "mm / dd / aa" (bajo mi nombre "VARUN TEJ REDDY")

Varun Tej Reddy
fuente