mysql - 我从带有子查询的 LEFT JOIN 中获得每个左行多个结果

标签 mysql sql join left-join

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

我在子查询中使用 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

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

最佳答案

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

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 评论)您的连接不需要括号。

关于mysql - 我从带有子查询的 LEFT JOIN 中获得每个左行多个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43049832/

相关文章:

c# - 关闭或处置读卡器时一切都会卡住

MySql GROUP BY 和 ORDER BY 重复数据删除

sql - 在编写 SQL 查询方面需要帮助

sql - 使用 join 更新多行速度非常慢

MySQL存储过程,错误: Result consisted of more than one row

mysql - SQL选择值然后在子查询中使用来替换字符串

mysql - 按日期和字段排序

sql - 如何加入 3 个表并按所有 3 个的日期排序?

mysql - 将一个表中的两列连接到另一表中的一列,为两列中的每一列返回不同或相同的结果

mysql select 按主键排序。表现