MySQL Multiple Joins em uma consulta?

121

Tenho a seguinte 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

Portanto, estou usando um INNER JOINe agarrando o image_id. Agora, quero pegar esse image_id e transformá-lo em images.filenameda tabela de imagens.

Como posso adicionar isso à minha consulta?

Desenhou
fonte

Respostas:

209

Você pode simplesmente adicionar outra junção 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 

No entanto, esteja ciente de que, por ser um INNER JOIN, se você tiver uma mensagem sem imagem, toda a linha será ignorada. Se esta for uma possibilidade, você pode querer fazer um LEFT OUTER JOINque retornará todas as suas mensagens do painel e um nome_do_arquivo_de_imagem apenas se houver (caso contrário, você obterá um 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 
Code Magician
fonte
19
alguém sabe como isso realmente funciona? A segunda junção está juntando os resultados da primeira junção com a tabela 3, ou está juntando a tabela 1 com a tabela 3 separadamente? (isto é, juntar a mesa 1 com a mesa 2 e depois juntar a mesa 1 separadamente com a mesa 3 e depois devolver tudo de volta?) Isso faz sentido? Eu pergunto porque tenho feito junções de várias tabelas como esta e às vezes consigo resultados inesperados.
Aaron Wallentine,
3
Isso é o que a cláusula ON lhe dirá. A cláusula ON para a 2ª junção (juntando a terceira tabela) está juntando dashboard_messages a imagens no campo image_id em cada tabela. Então, neste caso, é A para B e B para C. Está sob seu controle. Você pode torná-lo A para B e A para C se precisar
John Biddle
16

Basta adicionar outra associação:

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
fonte
9

Compartilhei minha experiência de usar dois LEFT JOINS em uma única consulta SQL.

Eu tenho 3 mesas:

Tabela 1) Paciente consiste nas colunas PatientID, PatientName

Tabela 2) Compromisso consiste nas colunas AppointmentID, AppointmentDateTime, PatientID, DoctorID

Tabela 3) Doctor consiste nas colunas DoctorID, DoctorName


Inquerir:

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

Eu escrevi a solução para obter o formato de data como "mm / dd / aa" (sob meu nome "VARUN TEJ REDDY")

Varun Tej Reddy
fonte
3

As junções múltiplas no SQL funcionam criando tabelas derivadas progressivamente uma após a outra. Veja este link explicando o processo:

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

Mohit
fonte
2
Sempre cite a parte mais relevante de um link importante, caso o site de destino esteja inacessível ou fique permanentemente offline.
Armali