【问题标题】:MySQL Multiple Joins in one query?MySQL 一个查询中的多个联接?
【发布时间】: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

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

【问题讨论】:

标签: mysql sql join


【解决方案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/

      【讨论】:

      • 始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
      猜你喜欢
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多