首页 > 解决方案 > MySQL 中的 GROUP BY,也考虑了创建时间戳

问题描述

对该数据集进行成像

+----+---------+---------+--------+------------+
| id | user_id | product | event  | timestamp  |
+----+---------+---------+--------+------------+
|  1 |       1 | car     | event1 | 1629992101 |
|  2 |       2 | car     | event2 | 1629992102 |
|  3 |       1 | bike    | event1 | 1629992103 |
|  4 |       1 | bike    | event1 | 1629992104 |
|  5 |       2 | bike    | event3 | 1629992105 |
|  6 |       2 | car     | event1 | 1629992106 |
+----+---------+---------+--------+------------+

在某种程度上,我希望能够为user_id每个产品获得 1 行,即时间戳最高的行。因此,例如,对于user_id2,输出将是:

+----+---------+---------+--------+------------+
| id | user_id | product | event  | timestamp  |
+----+---------+---------+--------+------------+
|  5 |       2 | bike    | event3 | 1629992105 |
|  6 |       2 | car     | event1 | 1629992106 |
+----+---------+---------+--------+------------+

对于user_id1,输出将是:

+----+---------+---------+--------+------------+
| id | user_id | product | event  | timestamp  |
+----+---------+---------+--------+------------+
|  1 |       1 | car     | event1 | 1629992101 |
|  4 |       1 | bike    | event1 | 1629992104 |
+----+---------+---------+--------+------------+

我做到了:

SELECT * FROM `table` WHERE `timestamp` IN (SELECT MAX(`timestamp`) FROM `table` WHERE (`user_id` = ?) GROUP BY `product`)

但这在某些情况下似乎有一些不稳定的结果。

更新:

由于重复,问题已关闭。在我看来,“重复”是相似的,但不同。就我而言,我希望进行额外的过滤,即:首先确保您只查看正确的user_id然后开始对行进行分组。链接的副本不支持这一点,对我来说,关键是该额外的子句发生在正确的时间,以避免 SQL 将不相关user_id的内容分组,这些内容稍后将被丢弃。

标签: mysql

解决方案


推荐阅读