MySQL 1つのクエリでの複数の結合?


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.filenameimagesテーブルから変換したいと思います。

それをクエリに追加するにはどうすればよいですか?


回答:


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すべてのダッシュボードメッセージとimage_filenameが存在する場合にのみそれを返すaを実行することができます(そうしないと、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 

19
これが実際にどのように機能するか知っていますか?2番目の結合は、最初の結合の結果をテーブル3と結合していますか、それとも、テーブル1とテーブル3を別々に結合していますか?(つまり、テーブル1をテーブル2に結合し、次にテーブル1をテーブル3に個別に結合し、それをすべて戻しますか?)それは理にかなっていますか?私はこのように複数テーブルの結合を行っているので、予期しない結果になる場合があるので、質問します。
Aaron Wallentine 2016年

3
それがON句でわかります。2番目の結合(3番目のテーブルに結合)のON句は、各テーブルのimage_idフィールドの画像にdashboard_messagesを結合します。したがって、この場合は、AからBになり、次にBからCになります。必要に応じて、AからBおよびAからCにすることができます
John Biddle

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

1つのSQLクエリで2つのLEFT JOINSを使用した経験を共有しました。

3つのテーブルがあります。

表1)患者は列PatientID、PatientNameで構成されています

表2)Appointmentは列AppointmentID、AppointmentDateTime、PatientID、DoctorIDで構成されます

表3)Doctorは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")のような日付形式を取得するためのソリューションを作成しました


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.