簡體   English   中英

左聯接SQL查詢

[英]Left join sql query

我想從用戶表中獲取所有數據,並從我的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM