mysql - 抓取另一个表中两个日期之间最后一次登录的所有用户
问题描述
我想获取在两个特定日期之间最后一次登录的所有用户。如何才能做到这一点?
注意:我这样做的原因sub.updated_at
是:
- 登录会话可能持续一天以上
- 相同的用户可以在不同的 PC 上登录并启动辅助会话
- 我需要让用户启动最后一个会话,然后检查它的最后更新时间。
示例构建:http ://sqlfiddle.com/#!9/39849/11
因此,从 sqlfiddle 上的示例中,我希望查询为 select Bill
,因为updated_at
对于他的最后一条记录,介于2019-09-15 00:00:00
and 之间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'
);
解决方案
您的查询可以简化为 -
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
这是小提琴。
推荐阅读
- angular - 在 firebase.json 中未检测到托管站点或目标
- javascript - 没有从firebase数据库内的返回中获取数据
- python-3.x - 在 Mac 上运行 python3 和 selenium 的问题
- verilog - 在 Verilog / SystemVerilog 中实例化处理元素网格的最佳方法?
- java - 如何过滤页面流
通过 Spring Boot 应用程序中的流 Java 11 API - python - rpy2 2.9.4版安装错误使用conda
- c - 在 C 中用 memcpy 替换 for 循环不起作用
- swiftui - macCatalyst 应用程序构建但不会在 Mac 上启动
- reactjs - Apex 图表不会立即显示
- python - 尝试使用附加,当我尝试打印附加创建的列表时,它显示“无”