Mysql中的组和排行

时间:2010-11-12 17:07:42

标签: php mysql

我正在尝试在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”

这是第二部分。

任何人都知道该怎么做? 谢谢! 特洛伊

4 个答案:

答案 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秒)