我正在尝试在mysql数据库中构建排名系统。
我在StackOverflow上找到了几个关于排名和项目的教程,关于将各行相互排序。
但是,我的问题是我需要按用户ID列对行进行分组,将值加到按用户ID分组的第二列,然后将它们与其他用户ID的组进行排名。
以下是我正在使用的表的示例:
user_id km_skied date_entered
1 34 2010-08-19
3 2 2010-08-23
1 3 2010-08-13
4 23 2010-08-01
3 5 2010-08-02
结果打印输出将按等级:
滑雪者等级:
Rank User ID Total KM 1 1 37 2 4 23 3 3 7
另外,我想知道如何找到特定用户的排名。意思是,如果我知道用户ID是什么,我可以给他们排名吗?比如说
“你的等级:2的345”
这是第二部分。
任何人都知道该怎么做? 谢谢! 特洛伊
答案 0 :(得分:2)
您的查询应该是这样的。将排名逻辑添加到外部循环。
select * from
(select user_id, sum(km_skied) as km from ski group by user_id) x
order by x.km desc;
不知道它是否是一个选项,但您可以使用临时表进行排名,如下所示:
create temporary table ranks (rank int primary key auto_increment, user_id int, km int);
insert into ranks (user_id, km)
select user_id, km from (
select user_id, sum(km_skied) as km from ski group by user_id
) x order by x.km desc;
这可以满足您的需求:
mysql> select * from ranks;
+------+---------+------+
| rank | user_id | km |
+------+---------+------+
| 1 | 1 | 37 |
| 2 | 4 | 23 |
| 3 | 3 | 7 |
+------+---------+------+
3 rows in set (0.00 sec)
这种方法的一个缺点是被绑定的滑雪者不会获得相同的等级。
答案 1 :(得分:0)
在外部查询中对子查询进行分组并对结果进行排名(使用之前找到的任何方法)。
答案 2 :(得分:0)
感谢您的帮助。 我能够根据以下查询得出答案:
$totalQuery = "SELECT SUM(track_length) as usertracklength, username, MAX(track_create_time) as lasttrack, count(DISTINCT track_create_time) as totaldays FROM user_tracks GROUP BY username ORDER BY usertracklength DESC";
$totalResult = mysql_query($totalQuery);
$rankResult = mysql_query($totalQuery);
$totalNumEntries = mysql_num_rows($totalResult);
然后将其输出到数组
// rank position array
$rankArray = array();
while ($row1 = mysql_fetch_array($rankResult)) {
$rankArray[] = $row1['username'];
}
然后使用php中的foreach在数组中找到该用户名的位置
foreach ($rankArray as $rank => $user) {
if ($user == $username) {
$yourRank = $rank+1;
}
}
这是漫长的过程,但我认为它适用于我想要的东西。 有点希望在mysql查询中完成它以提高效率。
谢谢!
答案 3 :(得分:0)
您可以尝试分组以将Km作为第一个查询求和,然后通过相关子查询跟随它以查找排名。例如,如果您的值存储在名为“test”的表中,请将Km值汇总到名为testtbl的表中,然后进行排名。
的MySQL> select * from test; + ------ + -------- + ------ + | Id | km_run |名字| + ------ + -------- + ------ + | 1 | 34 | a | | 3 | 2 | c | | 1 | 3 | a | | 4 | 23 | d | | 3 | 5 | c | + ------ + -------- + ------ + 5行(0.00秒)
的MySQL>创建表testtbl为 (选择Id,sum(km_run)为tot 从测试 按ID分组;
查询OK,3行受影响(0.04秒) 记录:3个重复:0警告:0
的MySQL> select * from testtbl; + ------ + ------ + | Id | tot | + ------ + ------ + | 1 | 37 | | 3 | 7 | | 4 | 23 | + ------ + ------ + 3行(0.00秒)
的MySQL>选择t1.Id,t1.tot, ((从testtbl t2中选择count(distinct t2.tot),其中t1.tot< t2.tot)+1)作为来自testtbl t1的Rk 由Rk订购; + ------ + ------ + ------ + | Id | tot | Rk | + ------ + ------ + ------ + | 1 | 37 | 1 | | 4 | 23 | 2 | | 3 | 7 | 3 | + ------ + ------ + ------ + 3行(0.00秒)