MySQL - 获取最近的用户访问情况。仅显示用户一次

标签 mysql sql

我有一个 user_profile_view 表:

定义如下:

+------------+------------+------+-----+---------+----------------+
| 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 次,我只需要最近一次访问该个人资料,然后显示我之前访问过的下一个用户。

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

谢谢大家!

最佳答案

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

要在不使用窗口函数的情况下执行此操作,您可以测试每个潜在的答案,以查看同一个表中是否存在同一 user_id 的行,但时间较新):

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;

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

关于MySQL - 获取最近的用户访问情况。仅显示用户一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7665170/

相关文章:

php - 如果可以,但其他不行

php - 使用 PHP 使用 MySQL 数据库中的数据填充 HTML 表

mysql - 如何在 Spring 中使用变量作为 @Query 的值

SQL Azure 和 CakePHP

MySQL:从 SELECT 语句到 INSERT 语句

mysql - 使用 UUID 时,是否也应该使用 AUTO_INCREMENT?

php - 从特定行中减去两列

php - 如何防止 PHP 中的 SQL 注入(inject)?

php - Cakephp 查找转换为 Sql 语法

SQL:在 WHERE 子句中使用来自 SELECT 的计算字段