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;
排序結果:
再對結果進行分組:
SELECT * FROM ( SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC ) lb GROUP BY lb.user_id;
得到的結果如下:
從結果可知,這并不是我們預期的結果。因MySql版本的原因,對Group By進行了優(yōu)化,導致前面的排序不再生效,而是保留了排序前的結果。
為了使Group By根據(jù)我們排序后的結果進行分組,需要加入關鍵字Limit告訴MySql需要進行排序。
修改之后的語句如下:
SELECT * FROM ( SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC LIMIT 100000 ) lb GROUP BY lb.user_id;
得到了預期的結果:
從SQL中,不難看出,這個方法存在一個缺陷,就是必須要保證原始數(shù)據(jù)在limit范圍內,否則分組的結果就不會是全部的數(shù)據(jù),結果自然也是不能保證的。
思路2:多表關聯(lián)
利用多表關聯(lián),同一緯度(User_Id)下的登錄時間進行比較,得出最近的時間。
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;
到此這篇關于Mysql 存在多條數(shù)據(jù)時如何按時間取最新的那一組數(shù)據(jù)的文章就介紹到這了,更多相關Mysql 取最新數(shù)據(jù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
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ù)庫進行分支的知識小結
盡管MySQL是最受歡迎的程序之一,但是許多開發(fā)人員認為有必要將其拆分成其他項目,并且每個分支項目都有自己的專長。該需求,以及 Oracle 對核心產(chǎn)品增長緩慢的擔憂,導致出現(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)無法遠程連接MySql服務器問題的解決辦法
這篇文章主要介紹了Navicat出現(xiàn)無法遠程連接MySql服務器問題的解決辦法,文章通過思路判斷出現(xiàn)問題的情況,然后進行逐一排查,確定問題出現(xiàn)的原因并給出解決辦法,本文對此問題的解決介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08