You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL内连接查询中仅显示用户最新登录记录

解决方法

因为usrlogid随每次登录递增,所以每个用户的最大usrlogid对应的就是最新登录记录,这里提供两种常用修改方式:

方法一:使用窗口函数(推荐,逻辑清晰)

利用ROW_NUMBER()窗口函数按用户分组,对每个用户的登录记录按usrlogid降序排序,只保留排序后行号为1的记录:

SELECT 
    Login_Date,
    User_Name,
    User_ID,
    Log_ID,
    Active
FROM (
    SELECT  
        usrlogs.serverlogintime AS Login_Date,
        usrlogs.usrname         AS User_Name,
        usrlogs.usrid           AS User_ID,
        usrlogs.usrlogid        AS Log_ID,
        users.status            AS Active,
        -- 按用户分组,按Log_ID降序排,给每条记录标行号
        ROW_NUMBER() OVER (PARTITION BY usrlogs.usrid ORDER BY usrlogs.usrlogid DESC) AS rn
    FROM   usrlogs
           INNER JOIN users
                   ON usrlogs.usrid = users.uid
    -- 直接用日期比较,比DATE_FORMAT更高效,避免索引失效
    WHERE  usrlogs.ServerLoginTime >= '2022-01-01' 
           AND users.status = '0'
) AS temp
-- 只保留每个用户的第一条(最新)记录
WHERE rn = 1;

方法二:使用子查询获取每个用户的最大Log_ID

先查询出每个用户符合条件的最大usrlogid,再关联原表获取完整记录:

SELECT 
    usrlogs.serverlogintime AS Login_Date,
    usrlogs.usrname         AS User_Name,
    usrlogs.usrid           AS User_ID,
    usrlogs.usrlogid        AS Log_ID,
    users.status            AS Active
FROM   usrlogs
       INNER JOIN users
               ON usrlogs.usrid = users.uid
       -- 关联子查询,获取每个用户的最大Log_ID
       INNER JOIN (
           SELECT usrid, MAX(usrlogid) AS max_log_id
           FROM usrlogs
           WHERE ServerLoginTime >= '2022-01-01'
           GROUP BY usrid
       ) AS max_logs
           ON usrlogs.usrid = max_logs.usrid
           AND usrlogs.usrlogid = max_logs.max_log_id
WHERE  users.status = '0';

额外优化提示

原查询中DATE_FORMAT(ServerLoginTime,'%Y-%m-%d') >= '2022-01-01'会导致ServerLoginTime字段的索引失效(如果有索引的话),改成ServerLoginTime >= '2022-01-01'更高效,因为数据库可以直接利用索引快速筛选数据。

内容的提问来源于stack exchange,提问作者M P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:36:31