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

Posted

技术标签:

【中文标题】MySQL 一个查询中的多个联接?【英文标题】:MySQL Multiple Joins in one query? 【发布时间】:2012-02-16 23:04:41 【问题描述】:

我有以下疑问:

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

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

【问题讨论】:

***.com/search?q=mysql+multiple+joins 【参考方案1】:

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

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 数据库上工作,这次它在另一个数据库上工作。谢谢。【参考方案2】:

只需添加另一个联接:

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

【讨论】:

【参考方案3】:

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

我有 3 张桌子:

表 1) Patient 包含 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”)

【讨论】:

【参考方案4】:

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

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

【讨论】:

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

以上是关于MySQL 一个查询中的多个联接?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以避免一个查询中的多个联接

查询中的多个联接

PHP/MySQL:在没有别名的联接查询中获取多个同名列? [复制]

MySQL(10)-多表查询

MySQL(10)-多表查询

sql SQLite不支持更新查询中的联接,这使得在基于多个选项卡中的信息进行更新时出现一些复杂性