首页 > 解决方案 > 抓取另一个表中两个日期之间最后一次登录的所有用户

问题描述

我想获取在两个特定日期之间最后一次登录的所有用户。如何才能做到这一点?

注意:我这样做的原因sub.updated_at是:

  1. 登录会话可能持续一天以上
  2. 相同的用户可以在不同的 PC 上登录并启动辅助会话
  3. 我需要让用户启​​动最后一个会话,然后检查它的最后更新时间。

示例构建:http ://sqlfiddle.com/#!9/39849/11

因此,从 sqlfiddle 上的示例中,我希望查询为 select Bill,因为updated_at对于他的最后一条记录,介于2019-09-15 00:00:00and 之间2019-09-15 23:59:59。其中一个John's条目也在这些日期之间更新,但他的最新记录已更新,2019-09-18 12:00:00因此不应该选择约翰。


这是一个可能的解决方案,但我担心性能,索引update_at应该有积极的影响,但如果我们有 100 万以上的用户和更多的用户登录怎么办:

SELECT *
FROM 
(
    SELECT *
    FROM (
        SELECT * 
        FROM `user_logins`
        WHERE `updated_at` >= '2019-09-15 00:00:00'
        ORDER BY `user_logins`.`id`  DESC
    ) as sub 
    GROUP BY `sub`.user_id
) as sub 
WHERE `sub`.updated_at BETWEEN '2019-09-15 00:00:00' and '2019-09-15 23:59:59'
SELECT *
FROM (
    SELECT * 
    FROM `user_logins`
    WHERE `updated_at` BETWEEN '2019-09-15 00:00:00' and '2019-09-15 23:59:59'
    ORDER BY `user_logins`.`id`  DESC
) as sub 
WHERE NOT EXISTS (
        SELECT 1
        FROM user_logins
        WHERE user_id = sub.user_id
            and updated_at > '2019-09-15 23:59:59'
    );

标签: mysql

解决方案


您的查询可以简化为 -

SELECT U.*, UL.*
FROM users U
JOIN user_logins UL ON U.id = UL.user_id
JOIN (SELECT user_id, MAX(updated_at) updated_at
      FROM user_logins
      GROUP BY user_id) UL2 ON UL2.updated_at = UL.updated_at
                            AND UL2.user_id = UL.user_id
WHERE DATE(UL2.updated_at) BETWEEN DATE('2019-09-15 00:00:00') AND DATE('2019-09-15 23:59:59')
ORDER BY UL.id DESC

是小提琴。


推荐阅读