ChatGPT解决这个技术问题 Extra ChatGPT

MySQL 一个查询中的多个联接?

我有以下查询:

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.filename

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


C
Code Magician

您可以像这样简单地添加另一个联接:

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 (否则您将获得空值)

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 

有人知道这实际上是如何工作的吗?第二个连接是将第一个连接的结果与表 3 连接,还是将表 1 与表 3 分别连接? (即,将表 1 与表 2 连接,然后将表 1 与表 3 分别连接,然后将其全部返回?)这有意义吗?我问是因为我一直在做这样的多表连接,有时会得到意想不到的结果。
这就是 ON 子句会告诉你的。第二个连接(连接第三个表)的 ON 子句将 dashboard_messages 连接到每个表中 image_id 字段上的图像。所以,在这种情况下,它是 A 到 B,然后是 B 到 C。它在你的控制之下。如果需要,您可以将其设为 A 到 B 和 A 到 C
这个查询一直有效!对我来说,2 年前它在另一个 MySQL 数据库上工作,这次它在另一个数据库上工作。谢谢。
r
rewritten

只需添加另一个联接:

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

C
Community

我分享了在单个 SQL 查询中使用两个 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

我编写了获得 date format like "mm/dd/yy" 的解决方案(以我的名字“VARUN TEJ REDDY”)


M
Mohit

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

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


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