mysql - SQL : get current online player count using login/logout timestamp

标签 mysql

我有一个 MySQL 表,其中包含 uid、登录/注销状态平面、时间戳,例如:

uid    flag    time
123    login   10:00:00
123    logout  10:10:00
321    login   10:08:00
321    logout  10:18:00

现在我想显示 10:08 到 10:09 之间每分钟的在线玩家数。期望什么:

Minute    current_player_cnt 
10:07         1
10:08         2
10:09         2

我可以将数据导出为 csv 文件并使用 python 执行此操作,但我想直接使用 sql 执行此操作,但找不到可以提供帮助的函数。

你不需要给出整个sql语句,只需要给出一个函数名就可以了。任何建议表示赞赏。

最佳答案

一种选择是使用日历表加入,例如

SELECT
    t1.Minute,
    COUNT(t2.uid) AS current_player_cnt
FROM
(
    SELECT '10:07:00' AS Minute UNION ALL
    SELECT '10:08:00' UNION ALL
    SELECT '10:09:00'
) t1
LEFT JOIN
(
    SELECT uid, MIN(time) AS login_time, MAX(time) AS logout_time
    FROM yourTable
    GROUP BY uid
) t2
    ON t1.Minute BETWEEN t2.login_time AND t2.logout_time OR
       (t1.Minute >= t2.login_time AND t2.login_time = t2.logout_time)
GROUP BY
    t1.Minute;

enter image description here

Demo

关于mysql - SQL : get current online player count using login/logout timestamp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54820898/

相关文章:

mysql - 创建索引导致 'Lost connection to MySQL'

mysql - 无法添加外键 MySQL :errno 150

php - 为什么不能将相同的 ID 插入到 MySQL 表的 'id' 列中?

mysql - 将大型 Web 应用程序从 mysql_connect 转换为 PDO 使用

php - 我想运行查询来获取 catagory_name 的层次结构

php - 如何从 $stmt 以外的自定义语句中回显行

sql - 为什么我的索引没有用于文本列上的 SELECT DISTINCT 查询?

php - 发送带有消息主题和正文的图像(可选)?

php - 在 MYSQL 中使用单个查询获取 3 个不同 SUM 的 "best"方法是什么

mysql - 在 Laravel 5 中使用查询生成器进行复杂查询