Mysql 存在多條數據,按時間取最新的那一組數據


1、數據如下,獲取每個用戶最近的一次登錄數據

 

 

思路1:order by + group by

  先根據UserId+LogInTime排序,再利用Group分組,即可得到每個User_Id的最新數據。

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進行了優化,導致前面的排序不再生效,而是保留了排序前的結果。

  為了使Group By根據我們排序后的結果進行分組,需要加入關鍵字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中,不難看出,這個方法存在一個缺陷,就是必須要保證原始數據在limit范圍內,否則分組的結果就不會是全部的數據,結果自然也是不能保證的。

 

  

思路2:多表關聯

  利用多表關聯,同一緯度(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;

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM