我有一個表,用於存儲所有用戶連接(日期&IP),我想用單個查詢檢索所有用戶數據(暱稱,頭像...)+最後一條記錄我對這個用戶的聯繫人記錄表...選擇最後一條記錄mysql左加入
SELECT
*
FROM
`users`
LEFT JOIN
`connections_history` ON `users`.`id` = `connections_history`.`guid`
我怎樣才能繼續THX
我有一個表,用於存儲所有用戶連接(日期&IP),我想用單個查詢檢索所有用戶數據(暱稱,頭像...)+最後一條記錄我對這個用戶的聯繫人記錄表...選擇最後一條記錄mysql左加入
SELECT
*
FROM
`users`
LEFT JOIN
`connections_history` ON `users`.`id` = `connections_history`.`guid`
我怎樣才能繼續THX
可惜Mysql
不支持window
功能,你需要Correlated sub-query
做到這一點。
嘗試這樣的事情
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)
您可以在ON
條款與相關子查詢做到這一點:
SELECT u.*, ch.*
FROM `users` u LEFT JOIN
`connections_history` ch
ON ch.`guid` = u.`id` AND
ch.date = (SELECT MAX(ch2.date)
FROM connections_history ch2
WHERE ch.guid = ch2.guid
);
這種配方允許查詢到connections_history(guid, date)
採取指數的優勢。
@EvaldasBuinauskas。 。 。 *數據分析的第1章使用SQL和Excel *解釋了查詢格式背後的基本原理。請不要編輯我的查詢的格式。 –
一種方法是在子查詢中查找每個guid的最大日期的行,然後加入用戶表。
像這樣:
select *
from `users` u
left join (
select *
from `connections_history` c
where date = (
select max(date)
from `connections_history` c2
where c.`guid` = c2.`guid`
)
) t on u.`id` = t.`guid`;
不是一個不好的解決方案,但它意味着一個索引不能用於'LEFT JOIN'。 –
假設connections_history
表中有一個AUTO_INCREMENT列id
:
SELECT *
FROM (
SELECT u.*, MAX(h.id) as hid
FROM users u
LEFT JOIN connections_history h ON u.id = h.guid
GROUP BY u.id
) u
LEFT JOIN connections_history h ON h.id = u.hid
確實'connections_history'有一個AUTO_INCREMENT PK? –