左连接sql查询

时间:2017-03-04 18:06:37

标签: mysql sql

我想从用户表中获取所有数据&从我的connection_history表中与他关联的最后一条记录,只有当我在查询结束时没有添加时才能正常工作

 ORDER BY contributions DESC

(当我添加它时,我只有来自用户的记录,而不是最后的connection_history记录)

我的问题是:我如何获得捐款DESC订购的entires数据

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) 

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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
             ) 

答案 2 :(得分:0)

我们可以使用嵌套查询首先检查给定用户的max_date,并将guid列表传递给嵌套查询,假设所有用户在连接历史记录表中至少有一条记录,否则您可以改为使用Left Join。 / p>

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;