这个问题困扰了我一段时间。
我有这个数据:
+----+---------+---------+---------------------+
| 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/