MySQL Multiple Joins en une seule requête?

121

J'ai la requête suivante:

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

Donc j'utilise un INNER JOINet je saisis le fichier image_id. Alors maintenant, je veux prendre cet image_id et le transformer à images.filenamepartir de la table images.

Comment puis-je ajouter cela à ma requête?

A dessiné
la source

Réponses:

209

Vous pouvez simplement ajouter une autre jointure comme ceci:

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 

Cependant, sachez que, comme il s'agit d'un INNER JOIN, si vous avez un message sans image, la ligne entière sera ignorée. Si c'est une possibilité, vous voudrez peut-être faire un LEFT OUTER JOINqui renverra tous les messages de votre tableau de bord et un nom de fichier image uniquement s'il en existe un (sinon vous obtiendrez un null)

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 
Magicien du code
la source
19
quelqu'un sait comment cela fonctionne réellement? La deuxième jointure joint-t-elle les résultats de la première jointure à la table 3 ou joint-t-elle la table 1 à la table 3 séparément? (c'est-à-dire joindre la table 1 à la table 2, puis joindre la table 1 séparément à la table 3, puis tout renvoyer?) Cela a-t-il un sens? Je demande parce que j'ai fait des jointures multi-tables comme celle-ci et que j'obtiens parfois des résultats inattendus.
Aaron Wallentine
3
C'est ce que vous dira la clause ON. La clause ON pour la deuxième jointure (rejoignant la troisième table) joint dashboard_messages aux images sur le champ image_id dans chaque table. Donc, dans ce cas, c'est A vers B puis B vers C. C'est sous votre contrôle. Vous pouvez faire de A à B et de A à C si vous en avez besoin
John Biddle
16

Ajoutez simplement une autre jointure:

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
la source
9

J'ai partagé mon expérience de l'utilisation de deux JOINS GAUCHE dans une seule requête SQL.

J'ai 3 tables:

Tableau 1) Le patient comprend les colonnes PatientID, PatientName

Tableau 2) Rendez-vous comprend les colonnes AppointmentID, AppointmentDateTime, PatientID, DoctorID

Tableau 3) Doctor comprend les colonnes DoctorID, DoctorName


Requete:

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

J'ai écrit la solution pour obtenir un format de date comme "mm / jj / aa" (sous mon nom "VARUN TEJ REDDY")

Varun Tej Reddy
la source
3

Les jointures multiples dans SQL fonctionnent en créant progressivement des tables dérivées les unes après les autres. Voir ce lien expliquant le processus:

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

Mohit
la source
2
Citez toujours la partie la plus pertinente d'un lien important, au cas où le site cible serait inaccessible ou serait définitivement hors ligne.
Armali