通过此查询,我应该从聊天表中获取我获得的每个协议(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/