Mysql 存在多條數(shù)據(jù)時如何按時間取最新的那一組數(shù)據(jù)(思路詳解)
1、數(shù)據(jù)如下,獲取每個用戶最近的一次登錄數(shù)據(jù)
思路1:order by + group by
先根據(jù)UserId+LogInTime排序,再利用Group分組,即可得到每個User_Id的最新數(shù)據(jù)。
SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC;
排序結(jié)果:
再對結(jié)果進(jìn)行分組:
SELECT * FROM ( SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC ) lb GROUP BY lb.user_id;
得到的結(jié)果如下:
從結(jié)果可知,這并不是我們預(yù)期的結(jié)果。因MySql版本的原因,對Group By進(jìn)行了優(yōu)化,導(dǎo)致前面的排序不再生效,而是保留了排序前的結(jié)果。
為了使Group By根據(jù)我們排序后的結(jié)果進(jìn)行分組,需要加入關(guān)鍵字Limit告訴MySql需要進(jìn)行排序。
修改之后的語句如下:
SELECT * FROM ( SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC LIMIT 100000 ) lb GROUP BY lb.user_id;
得到了預(yù)期的結(jié)果:
從SQL中,不難看出,這個方法存在一個缺陷,就是必須要保證原始數(shù)據(jù)在limit范圍內(nèi),否則分組的結(jié)果就不會是全部的數(shù)據(jù),結(jié)果自然也是不能保證的。
思路2:多表關(guān)聯(lián)
利用多表關(guān)聯(lián),同一緯度(User_Id)下的登錄時間進(jìn)行比較,得出最近的時間。
select b1.* from login_db b1 where (select COUNT(1) from login_db b2 where b2.user_id = b1.user_id and b1.login_time <= b2.login_time) <= 1;
到此這篇關(guān)于Mysql 存在多條數(shù)據(jù)時如何按時間取最新的那一組數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Mysql 取最新數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 聯(lián)合索引與Where子句的優(yōu)化 提高數(shù)據(jù)庫運行效率
網(wǎng)站系統(tǒng)上線至今,數(shù)據(jù)量已經(jīng)不知不覺上到500M,近8W記錄了。涉及數(shù)據(jù)庫操作的基本都是變得很慢了,這篇文章主要是說明配置并不是數(shù)據(jù)庫操作慢的主要原因2012-01-01超越MySQL 對流行數(shù)據(jù)庫進(jìn)行分支的知識小結(jié)
盡管MySQL是最受歡迎的程序之一,但是許多開發(fā)人員認(rèn)為有必要將其拆分成其他項目,并且每個分支項目都有自己的專長。該需求,以及 Oracle 對核心產(chǎn)品增長緩慢的擔(dān)憂,導(dǎo)致出現(xiàn)了許多開發(fā)人員感興趣的子項目和分支2012-01-01MySQL實現(xiàn)統(tǒng)計過去12個月每個月的數(shù)據(jù)信息
這篇文章主要介紹了MySQL實現(xiàn)統(tǒng)計過去12個月每個月的數(shù)據(jù)信息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Navicat出現(xiàn)無法遠(yuǎn)程連接MySql服務(wù)器問題的解決辦法
這篇文章主要介紹了Navicat出現(xiàn)無法遠(yuǎn)程連接MySql服務(wù)器問題的解決辦法,文章通過思路判斷出現(xiàn)問題的情況,然后進(jìn)行逐一排查,確定問題出現(xiàn)的原因并給出解決辦法,本文對此問題的解決介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08