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 一个查询中的多个联接?的主要内容,如果未能解决你的问题,请参考以下文章