2011-10-05 64 views
0

我有一个user_profile_view表用户:MySQL - 获得最近的用户访问。只显示一次

的定义如下:

+------------+------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+------------+------------+------+-----+---------+----------------+ 
| id   | bigint(20) | NO | PRI | NULL | auto_increment | 
| user_id | bigint(20) | NO | MUL | NULL |    | 
| viewer_id | bigint(20) | NO | MUL | NULL |    | 
| created_at | datetime | NO |  | NULL |    | 
| updated_at | datetime | NO |  | NULL |    | 
+------------+------------+------+-----+---------+----------------+ 

我试图获取最新的考察,但我只想要一次显示用户

一个简单的查询,如这将返回上一个配置文件最近访问:

SELECT v.* FROM user_profile_view v 
WHERE v.user_id != 1 AND v.viewer_id = 1 
ORDER BY created_at DESC LIMIT 0,10; 

结果集:

+-----+---------+-----------+---------------------+---------------------+ 
| id | user_id | viewer_id | created_at   | updated_at   | 
+-----+---------+-----------+---------------------+---------------------+ 
| 946 |  19 |   1 | 2011-10-05 19:20:19 | 2011-10-05 19:20:19 | 
| 945 |  19 |   1 | 2011-10-05 19:16:15 | 2011-10-05 19:16:15 | 
| 944 |  2 |   1 | 2011-10-05 19:12:02 | 2011-10-05 19:12:02 | 
| 943 |  13 |   1 | 2011-10-05 19:11:45 | 2011-10-05 19:11:45 | 
| 942 |  19 |   1 | 2011-10-05 19:10:41 | 2011-10-05 19:10:41 | 
| 941 |  2 |   1 | 2011-10-05 19:06:35 | 2011-10-05 19:06:35 | 
| 940 |  19 |   1 | 2011-10-05 18:53:04 | 2011-10-05 18:53:04 | 
| 939 |  19 |   1 | 2011-10-05 18:51:56 | 2011-10-05 18:51:56 | 
| 938 |  19 |   1 | 2011-10-05 18:46:59 | 2011-10-05 18:46:59 | 
| 937 |  20 |   1 | 2011-10-05 18:42:35 | 2011-10-05 18:42:35 | 
+-----+---------+-----------+---------------------+---------------------+ 

但是我只是想回报用户一次。因此,如果我最近查看了3次用户配置文件,我只想要最近访问该配置文件,然后显示我之前访问过的下一个用户。

这应该是微不足道的,但由于某种原因,我卡住了。

谢谢大家!

回答

1

这实际上并不重要。这是一个“最大的N组”问题。 SQL的某些变体已经添加了窗口函数来处理这个问题,我不确定MySQL是否有。

要做到这一点不开窗功能,您可以测试每个可能的答案,看是否在同一个表存在一排相同user_ID的,但一个更近created_at时间):

SELECT v.* FROM user_profile_view v 
WHERE v.user_id != 1 AND v.viewer_id = 1 
    AND NOT EXISTS 
    (SELECT * FROM user_profile_view v2 
     WHERE v2.user_id = v.user_id AND v2.created_at > v.created_at) 
ORDER BY created_at DESC LIMIT 0,10; 

注意联系(具有完全相同的created_at值的两条记录)将返回两行。

+0

太棒了!谢谢!我不知道每个组的问题。现在我知道了,谢谢你的启发和非常感谢你的答案!正是我需要的。祝你有美好的一天 :-) – Flukey