【问题标题】:I'm getting more than one result per left row from a LEFT JOIN with a subquery我从带有子查询的 LEFT JOIN 中每左行得到一个以上的结果
【发布时间】:2017-03-27 14:58:17
【问题描述】:

通过这个查询,我应该从聊天表中获取我获得的每份协议的最新消息,以及包括公司名称等在内的所有信息。

我在子查询中使用 GROUP BY 解决了这个问题,但这不是我想要解决的方法,因为我不明白为什么它确实充当 RIGHT JOIN,为什么它不订购它我在子查询中的意思:

SELECT agreements.id, agreements.`date`, agreements.state, business.name, chat.message
FROM ((agreements JOIN
       business_admin
       ON agreements.business = business_admin.business AND business_admin.user = 1
      ) LEFT JOIN
     business
     ON business.id = agreements.business
    ) LEFT JOIN
    (SELECT agreements_chat.agreement, agreements_chat.message
     FROM agreements_chat
     WHERE origin = 0 
     ORDER BY agreements_chat.`date` DESC
    ) AS chat
    ON agreements.id = chat.agreement

非常感谢您的帮助,非常感谢!

【问题讨论】:

  • 你为什么在你的连接周围使用括号?为什么在子查询中使用order by

标签: mysql sql join left-join


【解决方案1】:

它不起作用,因为左连接中的子查询返回多行,因此您得到的行重复。

SELECT  agreements.id,
        agreements.`date`,
        agreements.state,
        business.name,
        chat.message
FROM    agreements
JOIN    business_admin
ON      agreements.business = business_admin.business AND
        business_admin.user = 1
LEFT JOIN
        business
ON      business.id = agreements.business
LEFT JOIN
        agreements_chat chat
ON      chat.origin = 0 AND
        chat.agreement = agreements.id
LEFT JOIN
        (
            SELECT  agreement, max(`date`) last_date
            FROM    agreements_chat
            GROUP BY agreement
        ) last_chat
ON      chat.agreement = last_chat.agreement AND
        chat.`date` = last_chat.last_date

请注意(根据@GordonLinoff 评论)您的联接不需要括号。

【讨论】:

  • 这不会为每个协议返回 1 个子查询记录,只返回一个子查询记录。
  • 正确,我编辑了它。现在它应该可以按预期工作了
  • 你在括号里是对的,它有点没用,只是在我的脑海里有结构的意义。 LIMIT 1 完美地解决了我想要的问题,但我不明白的是为什么 LEFT JOIN 的行为就像一个 JOIN,我尝试删除最后一个完整的 LEFT JOIN 并且它只给了我一行,所以左边的部分是就一行无论如何谢谢大家:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多