MySQL多个连接在一个查询中?

Dre*_*rew 105 mysql sql join

我有以下查询:

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
Run Code Online (Sandbox Code Playgroud)

所以我正在使用INNER JOIN并抓住了image_id.所以现在,我想把image_id images.filename从图像表中转换成.

如何将其添加到我的查询中?

Cod*_*ian 185

你可以简单地添加另一个这样的连接:

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 
Run Code Online (Sandbox Code Playgroud)

但请注意,因为它是一个INNER JOIN,如果你有一个没有图像的消息,将跳过整行.如果有可能,您可能想要执行一个LEFT OUTER JOIN只返回所有仪表板消息和image_filename(否则您将获得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 
Run Code Online (Sandbox Code Playgroud)

  • 有谁知道这实际上是如何工作的?第二个连接是否与表3连接第一个连接的结果,还是将表3与表3分开连接?(即,将表1与表2连接,然后将表1与表3分开,然后将它全部返回?)这有意义吗?我问,因为我一直在做这样的多表连接,有时会得到意想不到的结果. (17认同)
  • 这就是ON子句将告诉您的。第二个联接(联接第三个表)的ON子句将dashboard_messages联接到每个表中image_id字段上的图像。因此,在这种情况下,是A到B,然后是B到C。这在您的控制之下。如果需要,可以将其设置为A到B或A到C (3认同)

Bri*_*oll 12

只需添加另一个联接:

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
Run Code Online (Sandbox Code Playgroud)


小智 8

我分享了在单个SQL查询中使用两个LEFT JOINS的经验.

我有3张桌子:

表1)患者包括PatientID,PatientName列

表2)约会包括列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
Run Code Online (Sandbox Code Playgroud)

我写了解决方案,以获取日期格式,如"mm/dd/yy"(以我的名字"VARUN TEJ REDDY")


小智 6

SQL 中的多重联接通过一个接一个地逐步创建派生表来工作。请参阅此链接解释该过程:

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

  • 始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。 (9认同)