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

时间:2010-01-29 13:54:38

标签: mysql join

我有两张桌子

User
  id
  name

Result
  id
  user_id
  score
  created_at

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

因此,Result表包含每个用户的许多记录。

我希望在任何特定时刻都能找到“前十名”用户。因此,每个用户只应返回一行,并且应该包含最近的可用分数,理想情况下,只有10行与这些分数最高的用户相关。

我目前正在获取所有结果,并使用php进行合作,我相信如果由数据库处理,它会更快更有效。但我不知道从哪里开始。

4 个答案:

答案 0 :(得分:5)

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)

答案 1 :(得分:1)

确定获取每个用户的最后创建日期,然后从那里选择不同的用户,他们的分数按照后代顺序排序并取第10行

SELECT DISTINCT u.id, u.name, r.score, md.max_date
FROM user u
INNER JOIN result r ON (u.id=r.user_id)
INNER JOIN (
 SELECT user_id, MAX(created_at) max_date
 FROM result
 GROUP BY user_id
) md ON (md.user_id=r.user_id AND r.created_at=md.max_date)
ORDER BY r.score DESC
LIMIT 10

答案 2 :(得分:0)

这应该做的工作:

SELECT user.id, user.name, MAX(result.score) maxscore FROM user
Left Join result on result.user_id=user.id
GROUP By user.id
ORDER By maxscore DESC
LIMIT 0,10

第二次尝试不确定...

SELECT user.id, user.name, result.score, result.created_at FROM user
LEFT JOIN result ON result.user_id = user.id
WHERE result.id IN (SELECT r.id FROM result r GROUP By r.user_id ORDER By MAX(r.created_at))
ORDER By score DESC
LIMIT 0,10

答案 3 :(得分:0)

这可能有效:

从中选择u.id,u.name,x.score 用户u,(从结果中选择user_id,得分(得分))x 其中u.id = x.user_id 按x.score排序 限制10