2011-10-05 63 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