我有两张 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/