mysql - 在我的sql中同一列下配对日期

标签 mysql

如何在 SQL 中的同一列下配对日期?

表格如下所示:

id | user       | type        | date
---+------------+-------------+-------------
 1 |          1 |    login    |  2014-03-19 15:41:52
 2 |          1 |    login    |  2014-03-19 19:41:52
 3 |          1 |    logout   |  2014-03-19 21:41:52
 4 |          2 |    login    |  2014-03-20 19:41:52
 5 |          2 |    logout   |  2014-03-20 20:41:52
 6 |          3 |    login    |  2014-03-21 19:41:52
 7 |          4 |    login    |  2014-03-21 19:42:52
 8 |          4 |    logout   |  2014-03-21 21:41:52
10 |          5 |    login    |  2014-03-19 21:45:52
11 |          5 |    login    |  2014-03-19 21:46:52
12 |          3 |    logout   |  2014-03-19 21:51:52
13 |          5 |    logout   |  2014-03-19 22:41:52

目的是将一次登录与一次注销配对。
在此示例中,用户 1 有 2 次登录和 1 次注销。

应忽略首次登录,最近一次登录应与最小注销配对:即配对登录 id=2 和注销 id=3

最佳答案

这样的方法可能有效,并且应该返回表中的所有组合,但随着表填满,性能可能会变得更差。为了获得更好的性能,请考虑将唯一生成的 SessionId 添加到表中,这对于登录和注销都是相同的。

SELECT t1.user, t1.date loginDate, t2.date LogoutDate 
FROM table t1 
LEFT JOIN table t2 
    ON t1.user = t2.user AND t1.type = 'login' and t2.type = 'logout' AND t1.Date < t2.Date 
LEFT JOIN table t3 
    ON t3.user = t1.user AND t3.type = 'login' and t3.date < t2.date 
WHERE t3.id IS NULL

关于mysql - 在我的sql中同一列下配对日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22895640/

相关文章:

MySQL utf-8 无法识别特殊字符

PHP 页面无法正确呈现

php - 我的mysql查询如何将 'Şarapçı Çağ'更改为 'Sarapci-Cag'

mysql - SQL中如何从三个表中检索数据

mysql - MySQL 表的 INSERT 语句

php - 自定义 Accordion 面板无法正常工作

php - 选择 UNIX_TIMESTAMP() 返回奇怪的 JSON 键

sql - 在 SQL WHERE ... IN 子句中使用文本文件中的术语

php - 如何在 Windows 中无需密码将 Laravel 应用程序连接到 MySQL

ios - Mysql blob图像在UiImage swift 3中的显示