MySQL过滤每个项目最后一个用户的第一个日期

标签 mysql

这个问题困扰了我一段时间。

我有这个数据:

+----+---------+---------+---------------------+
| id | file_id | user_id | action_datetime     |
+----+---------+---------+---------------------+
|  1 |       1 |       2 | 2014-03-13 13:39:31 |
|  2 |       1 |       2 | 2014-03-13 13:39:43 |
|  3 |       1 |       1 | 2014-03-13 13:59:34 |
|  4 |       1 |       1 | 2014-03-13 14:01:38 |
|  5 |       1 |       1 | 2014-03-13 14:03:12 |
|  6 |       2 |       2 | 2014-03-13 14:04:51 |
|  7 |       2 |       2 | 2014-03-13 14:07:37 |
|  8 |       1 |       1 | 2014-03-13 14:08:04 |
|  9 |       3 |       1 | 2014-03-13 14:08:09 |
| 10 |       3 |       1 | 2014-03-13 14:08:12 |
| 11 |       4 |       1 | 2014-03-13 14:08:14 |
| 12 |       4 |       1 | 2014-03-13 14:08:16 |
| 13 |       5 |       1 | 2014-03-13 14:08:26 |
| 14 |       1 |       1 | 2014-03-13 14:08:40 |
| 15 |       2 |       2 | 2014-03-13 14:09:13 |
+----+---------+---------+---------------------+

我需要为每个文件选择最后一个用户的第一个日期的行,即我需要的行是:

+----+---------+---------+---------------------+
| id | file_id | user_id | action_datetime     |
+----+---------+---------+---------------------+
|  3 |       1 |       1 | 2014-03-13 13:59:34 |
|  6 |       2 |       2 | 2014-03-13 14:04:51 |
|  9 |       3 |       1 | 2014-03-13 14:08:09 |
| 11 |       4 |       1 | 2014-03-13 14:08:14 |
| 13 |       5 |       1 | 2014-03-13 14:08:26 |
+----+---------+---------+---------------------+

我在下面的查询行中尝试了一些事情,但我知道这并不好。请帮忙。

SELECT
t1.id as id,
t1.file_id as file_id,
t1.user_id as user_id,
t1.action_datetime as datetime
FROM `table_1` as t1 
WHERE t1.`id` IN (SELECT MIN(id) FROM `table_1` GROUP BY `file_id`) 

SQL fiddle HERE

提前致谢。

最佳答案

给你:

SELECT t.* FROM (
  SELECT t2.`file_id`, t2.`user_id`, MIN(t2.`action_datetime`) ts_first_date FROM (
    SELECT t1.*
    FROM table_1 t1
    JOIN (
      SELECT `file_id`, MAX(`action_datetime`) as ts_last_user
      FROM table_1
      GROUP BY `file_id`
    ) tmp2
    ON tmp2.`file_id` = t1.`file_id` AND tmp2.ts_last_user = t1.action_datetime
  ) t3
  JOIN table_1 t2
  ON t3.`file_id` = t2.`file_id` AND t3.`user_id` = t2.`user_id`
  GROUP BY t2.`file_id`, t2.`user_id`
) outertable
JOIN
table_1 t
ON t.user_id = outertable.user_id AND t.file_id = outertable.file_id AND t.action_datetime = outertable.ts_first_date
ORDER BY t.file_id

我知道它很难理解,但它仍然有效:)

工作 fiddle :http://sqlfiddle.com/#!2/ba935f/105

Inner most join 用于查找 file_id 和 user_id 对,以获取文件的最后一个用户。然后,您在其他连接中使用该对来获取该特定组的首次访问日期。

关于MySQL过滤每个项目最后一个用户的第一个日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22373847/

相关文章:

mysql - NodeJS中显示的日期与MySQL中显示的日期不一样,如何解决?

mysql - 从 Xoops 数据库中计算并插入评论

php - MySQL 和 php 表中的不同行但具有相同的外键

php - SQL 语法错误和未定义索引错误

mysql周从周一到周日

php - 获取 php 中最后执行的 mysqli 查询的结果,并在另一个查询中使用结果

mysql - 如何正确执行触发器?

mysql - 如何从单列创建具有日期间隔的虚拟列

mysql - 仅获取匹配间隔的唯一时间戳行

php - 将 MySQL 插入从逗号分隔转换为管道