如何使用mysql查询选择每天的最小和最大时间以及用户名?

3bygqnnd  于 2023-01-01  发布在  Mysql
关注(0)|答案(1)|浏览(159)

我有mysql 5.7.40 db表与简单的布局

| userid | datetime         | ipaddress |
|--------|------------------|-----------|
| 1      | 25-11-2022 05:30 | 10.15.1.1 |
| 1      | 21-11-2022 05:30 | 10.15.1.1 |
| 2      | 22-11-2022 11:30 | 10.15.1.1 |
| 1      | 23-11-2022 22:30 | 10.15.1.1 |
| 2      | 25-11-2022 14:30 | 10.15.1.1 |
| 3      | 20-11-2022 18:30 | 10.15.1.1 |
| 3      | 23-11-2022 05:30 | 10.15.1.1 |
| 2      | 11-11-2022 09:30 | 10.15.1.1 |
| 1      | 22-11-2022 11:30 | 10.15.1.1 |
| 2      | 23-11-2022 13:30 | 10.15.1.1 |
| 2      | 08-11-2022 12:30 | 10.15.1.1 |
| 1      | 04-03-2022 11:30 | 10.15.1.1 |
| 3      | 25-11-2022 10:30 | 10.15.1.1 |
| 3      | 23-11-2022 15:30 | 10.15.1.1 |

我希望在一条记录中输出每个用户ID和每天的输出,显示开始时间和开始ipaddress和结束时间和结束ipaddress,使用mysql查询。

| userid | date       | start ipaddress | start time | end ipaddress | end time |
|--------|------------|-----------------|------------|---------------|----------|
| 1      | 25-11-2022 | 10.15.1.1       | 05:30      | 10.15.1.1     | 14:30    |
| 1      | 26-11-2022 | 10.15.1.2       | 06:20      | 10.15.1.2     | 16:30    |
| 2      | 22-11-2022 | 10.15.1.4       | 10:21      | 10.15.1.3     | 12:30    |
| 3      | 23-11-2022 | 10.15.1.6       | 12:30      | 10.15.1.5     | 16:30    |
| 2      | 25-11-2022 | 10.15.1.3       | 07:45      | 10.15.1.3     | 15:30    |
| 3      | 21-11-2022 | 10.15.1.1       | 04:33      | 10.15.1.1     | 19:30    |

我试过使用self join和inner join,但没有成功,希望有人能帮助我找到一个直接的解决方案。另外,我还担心查询时间,因为这个表有数百万条记录。

  • 请注意,以上示例中使用的数据并不一致,只是为了传达我想要实现的想法。*

感谢你的帮助,谢谢。

vlf7wbxs

vlf7wbxs1#

假设datetime实际上是一个datetime列,应该可以执行如下操作:

SELECT v.userid,
    v._date,
    ul1.ipaddress AS start_ip,
    TIME_FORMAT(v._start, '%H %i') AS start_time,
    ul2.ipaddress AS end_ip,
    TIME_FORMAT(v._end, '%H %i') AS end_time
FROM (
    SELECT userid, min(datetime) AS _start, max(datetime) AS _end, DATE(datetime) AS _date
    FROM userlogin
    GROUP BY userid, DATE(datetime)
) v
    JOIN userlogin ul1 ON ul1.datetime = v._start AND ul1.userid = v.userid
    JOIN userlogin ul2 ON ul2.datetime = v._end AND ul2.userid = v.userid

这个想法是创建一个连接表到自己的视图,它已经按日期和开始和结束时间分组。你可以在这里阅读更多关于各种方法的信息:https://dev.mysql.com/doc/refman/5.7/en/example-maximum-column-group-row.html
不幸的是,你可能会像注解中提到的那样将datetime存储为varchar,这使得这一点有点棘手。你可能会通过使用str_to_date()来实现上面的方法,但需要进行一些数据操作。

  • 最好在问题中包含模式和示例数据。* dbfiddle或类似数据会更好。

相关问题