我试着在这个网站上搜索和查看问题,但我认为"用户"和"登录"这两个词把答案抛到了脑后.

我有一个应用程序,它使用MySQL数据库,其中用户详细信息存储在USERS表中.MySQL服务器版本为:5.7.42-cll-lve-mySQL社区服务器-(GPL).

我正在try 找出应用程序拥有的最大并发用户数,以及这是在什么时候.请注意,我所说的users是指我的应用程序的用户,而不是数据库用户.另外,了解实际的用户名(而不仅仅是用户数量)也会很有帮助.

表 struct 如下:

CREATE TABLE `Users` (
 `user_ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `username` varchar(25) NOT NULL,
 `last_login` datetime NOT NULL,
 `last_logout` datetime NOT NULL,
 PRIMARY KEY (`user_ID`),
 UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=1813 DEFAULT CHARSET=utf8

我根据本站点的帮助编写的查询如下:

SELECT user_ID, username, last_login, last_logout, last_logout - last_login AS seconds
FROM Users
WHERE last_login < last_logout
AND last_logout > last_login
ORDER BY last_login;

但这并没有给我带来我想要的结果.请注意,LAST_LOGIN和LAST_LOGOUT列存储为DATETIME.

我还try 使用类似于下面的联接,但这也不起作用:

SELECT user_ID, username, last_login, last_logout, last_logout -last_login AS seconds
FROM Users A
INNER JOIN Users B ON (B.last_login <= last_logout)
AND (B.last_logout >= A.last_login_datetime)
AND A.user_ID <> B.user_ID;

我做错了什么?

推荐答案

也许是这样的:

SELECT LoginDate,
       GROUP_CONCAT(username) AS 'Concurrent_users',
       COUNT(username) AS 'Total_users'
   FROM
(SELECT DATE(u1.last_login) AS LoginDate,
       u1.username,
       u1.last_login,
       u1.last_logout
FROM Users u1
JOIN Users u2
 ON u1.user_ID <> u2.user_ID
  AND u2.last_login BETWEEN u1.last_login AND u1.last_logout
UNION ALL
SELECT DATE(u2.last_login) AS LoginDate,
       u2.username,
       u2.last_login,
       u2.last_logout
FROM Users u1
JOIN Users u2
 ON u1.user_ID <> u2.user_ID
  AND u2.last_login BETWEEN u1.last_login AND u1.last_logout) a
GROUP BY LoginDate;

它是一个UNION ALL个查询的版本,来自

SELECT DATE(u1.last_login) AS LoginDate,
       u1.username,
       u1.last_login,
       u1.last_logout
FROM Users u1
JOIN Users u2
 ON u1.user_ID <> u2.user_ID
  AND u2.last_login BETWEEN u1.last_login AND u1.last_logout

唯一的区别是u1u2之间的切换.在外部查询中,我们按登录日期分组,group_concat用户名并计算有多少.

菲德尔:https://dbfiddle.uk/Nl4Qp5OX

Mysql相关问答推荐

S优化联接更新的最佳方式是什么?

在停靠容器中备份和恢复MySQL数据库时出现Unicode字符问题

默认情况下,MariaDB是否限制为本地主机?

递归查询意外地为一个字段返回空值

Ballerina SQL 中是否也应该考虑输入清理?

错误:此查询集包含对外部查询的引用,并且只能在子查询中使用

如何将数据导入MySQL中的master/replica struct

检索按键列值分组的最新日期 (MySql)

使用 SET 变量进行 MySQL 查询

MySQL如何在小时和分钟之间 Select 时间

了解 Spring 和数据库级别的事务?

如何使用 IF() 条件在 MySQL 中显示真假行

MYSQL LOAD DATA INFILE 语句适用于工作台,但不适用于 python

sql sum - 处理连接表中的脏重复项

使用 MySQL LIMIT、OFFSET 进行分页

获取Count(*)占GROUP BY中所有项目数的百分比

mysql 按日期 Select 总和组

问号在 MySQL 中WHERE column = ?的意义是什么?

如何在 MySQL 中删除此索引?

警告:mysqli_connect(): (HY000/1045): Access denied for user 'username'@'localhost' (using password: YES)