[英]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.