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;