我想从用户表中获取所有数据以及从我的connection_history表中与它们关联的最后一条记录,只有当我不在查询末尾添加时它才起作用
ORDER BY contributions DESC
(当我添加它时,我只有来自用户的记录,而不是最后的connection_history记录)
我的问题是:如何获取按贡献 DESC 排序的整个数据?
SELECT * FROM users LEFT JOIN connections_history ch ON users.id = ch.guid
AND EXISTS (SELECT 1
FROM connections_history ch1
WHERE ch.guid = ch1.guid
HAVING Max(ch1.date) = ch.date)
order by
不应影响返回的结果。它仅更改顺序。您可能会得到您想要的东西,只是以意想不到的顺序。例如,您的查询接口可能返回固定数量的行。更改行的顺序可能会使结果集看起来不同。
我会说,为此目的,我发现
=
比 EXISTS
更直观:
SELECT *
FROM users u LEFT JOIN
connections_history ch
ON u.id = ch.guid AND
ch.date = (SELECT Max(ch1.date)
FROM connections_history ch1
WHERE ch.guid = ch1.guid
)
ORDER BY contributions DESC;
原因是
=
直接在ON
子句中,所以很清楚表之间的关系是什么。
为了您的随意考虑,原始代码的不同格式。特别注意缩进的
AND
表明该子句是 LEFT JOIN
的一部分,事实也确实如此。
SELECT * FROM users
LEFT JOIN connections_history ch ON
users.id = ch.guid
AND EXISTS (SELECT 1
FROM connections_history ch1
WHERE ch.guid = ch1.guid
HAVING Max(ch1.date) = ch.date
)
我们可以使用嵌套查询首先检查给定用户的 max_date 并将 guid 列表传递给嵌套查询,假设所有用户在连接历史记录表中至少有一条记录,否则您可以使用 Left Join。
select B.*,X.* from users B JOIN (
select A.* from connection_history A
where A.guid = B.guid and A.date = (
select max(date) from connection_history where guid = B.guid) )X on
X.guid = B.guid
order by B.contributions DESC;