左连接sql查询

问题描述 投票:0回答:3

我想从用户表中获取所有数据以及从我的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) 
mysql sql
3个回答
3
投票

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
子句中,所以很清楚表之间的关系是什么。


0
投票

为了您的随意考虑,原始代码的不同格式。特别注意缩进的

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
             ) 

0
投票

我们可以使用嵌套查询首先检查给定用户的 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;
© www.soinside.com 2019 - 2024. All rights reserved.