【发布时间】:2016-11-26 00:32:49
【问题描述】:
这是我在开发排名系统时遇到的一个有趣问题。
三个表:
- 用户(ID、年龄、...)
- 路线(id、难度……)
- 日志(id、user_id、route_id、点数、日期……)
我们的目标是生成一个用户列表,按照他们在前 10 条日志中获得的分数排序。对于每个用户,我必须找到他/她的前 10 个日志(按点排序),然后按此数字对所有用户进行排序。
我还必须能够限制其他参数考虑的路线和用户 -> 用户年龄、路线难度、日志日期。例如,从所有添加难度为 1-8 的路线的 25 岁以上的用户中创建此排名列表,这些用户不超过一个月(日志)。
这是我目前所获得的: 1.我知道如何根据总积分来选择和排序用户:
SELECT
l.id, l.idr,
u.name,..., ...,
SUM(l.points) as totalPoints
FROM logs l
INNER JOIN routes r ON l.idr = r.id
INNER JOIN users u ON d.idu = u.id
WHERE
/*
All the conditions I need
*/
GROUP BY u.id
ORDER BY totalPoints DESC
-
为一位用户选择前 10 名:
SELECT SUM(points) FROM ( SELECT l.points as points FROM logs l INNER JOIN users u ON l.idu = u.id WHERE u.id = '1' LIMIT 10 ) AS T
我只是不知道如何有效地将这些组合在一起。我已经通过一些临时表解决了这个问题,并在 PHP 的 while 循环中请求了额外的数据,但这非常非常缓慢且效率低下。随着数据库越来越大(日志 ~ 40 000,用户 ~ 2 000,路由 ~ 1 000 条记录),需要更有效的解决方案。
正如我所提到的,我正在使用 PHP,所以如果您知道如何使这更快(更高效),而不是通过创建一个很棒的查询,而是通过几个更聪明的小查询和一些在 PHP 中的查询,那将是真的科尔也是。
感谢您的任何想法:)
【问题讨论】:
标签: php mysql sorting group-by inner-join