mySQL 查询,用于按连接列限制和排序的离散结果

标签 mysql join

我有两张 table

User
  id
  name

Result
  id
  user_id
  score
  created_at

每小时都会运行一个 cron 作业,并将数据放入每个用户的结果表中 - 根据一些外部变量参数为他们分配一个分数。

因此结果表包含每个用户的许多记录。

我想在任何给定点检索“前十名”用户。因此,每个用户只应返回一行,并且应包含其最新的可用分数,理想情况下仅返回与分数最高的 10 个用户相关的 10 行。

我目前获取所有结果并使用 php 进行腿部工作,我相当确定如果由数据库处理的话会更快、更高效。但我不知道从哪里开始。

最佳答案

SELECT u.id,
       u.name,
       r.score
FROM Result r
JOIN
  (SELECT user_id, MAX(created_at) AS max_date
   FROM Result
   GROUP BY user_id) lr ON r.user_id=lr.user_id
JOIN User u ON u.id=r.user_id
WHERE r.created_at=lr.max_date
ORDER BY r.score DESC LIMIT 10;

示例运行:

mysql> insert into User (name) values ('foo'), ('bar');
mysql> insert into Result (user_id, score, created_at) values (1,100,'2010-01-20'), (2,150,'2010-01-20'),(1,150,'2010-01-21'),(2,100,'2010-01-21');
mysql> SELECT u.id,        u.name,        r.score FROM Result r JOIN   (SELECT user_id, MAX(created_at) AS max_date    FROM Result    GROUP BY user_id) lr ON r.user_id=lr.user_id JOIN User u ON u.id=r.user_id WHERE r.created_at=lr.max_date ORDER BY r.score DESC LIMIT 10;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | foo  |   150 | 
|  2 | bar  |   100 | 
+----+------+-------+
2 rows in set (0.00 sec)

关于mySQL 查询,用于按连接列限制和排序的离散结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2162318/

相关文章:

mysql - 当用户关闭浏览器时,保持与数据库mysql的通信

Mysql Full Outer Join 临时表

Mysql获取加入/选择表的最新行(1 :n)

mysql - SQL 查询连接表并比较总和以返回最大值

sql - 左联接中的歧义(仅适用于Oracle?)

在 Google bigquery 的 On 子句中使用 <= 进行连接

php - 如果值为 null 则跳过插入查询 Mysql

php - 比较来自 MySql 和 Datepicker 的日期

PHP:同时理解 POST 和 GET 时遇到困难

mysql - 数据库名称中带有连字符的命令行 MySQL 转储