如何在php中基于两个值查找排名?
我有一个php中与训练相关的web应用程序,其中包含训练表,该表根据活动类型(如跑步、游泳、骑自行车等)存储用户的每日训练数据。我需要生成一个排行榜的排名系统为基础的高如何在php中基于两个值查找排名?,php,mysql,Php,Mysql,我有一个php中与训练相关的web应用程序,其中包含训练表,该表根据活动类型(如跑步、游泳、骑自行车等)存储用户的每日训练数据。我需要生成一个排行榜的排名系统为基础的高 选择 求和(平均速度)作为平均速度, 总和(最大转速)作为最大转速, 创建日期, 用户id 从训练中 其中创建的日期为“%2019-12%” 按用户id分组 通过此查询,我得到如下输出: 我需要的输出应该基于平均速度尝试这样玩查询 select user_id,avg,max from users nu join (
选择
求和(平均速度)作为平均速度,
总和(最大转速)作为最大转速,
创建日期,
用户id
从训练中
其中创建的日期为“%2019-12%”
按用户id分组
通过此查询,我得到如下输出:
我需要的输出应该基于平均速度尝试这样玩查询
select user_id,avg,max from users nu
join
(
select sum(avg_speed) as avg,sum(max_speed) as max,user_id FROM workouts group by user_id
)t2 on t2.user_id=nu.id
where avg<30 and max <50
and date_created LIKE '%2019-12%'
group by t2.user_id order by avg desc;
这可能会帮助您您可以尝试以下SQL语句:
SELECT s1.avg_speed, s1.max_speed, s1.user_id,
@row_num:=IF(s1.avg_speed = @last_avg_speed, @row_num, @origin_row_num+1) rank_no,
@last_avg_speed:=s1.avg_speed last_avg_speed,
@origin_row_num:=@origin_row_num+1 origin_row_num
FROM (
SELECT SUM(avg_speed) avg_speed, SUM(max_speed) max_speed, user_id FROM workouts
WHERE date_created LIKE '2019-12%'
GROUP BY user_id
) s1, (SELECT @origin_row_num:=0, @row_num:=0, @last_avg_speed:=0) R
WHERE s1.avg_speed < 30 AND s1.max_speed < 50
ORDER BY s1.avg_speed DESC
在最后一列中,last_avg_speed
始终等于avg_speed,您可以忽略它
顺便说一下,如果您使用的是MySQL 8.0.0或更高版本,您可以使用
ROW_NUMBER()
和RANK()
函数来非常简单地解决它。是文档。1)您可以从所有可能的用户id
中随机获取创建的日期。2) 所需输出应基于平均速度是,因为对于特定月份,我需要获取数据,您必须获取特定日期。例如,<代码> min(DATEA创建)。考虑我创建的DATEY是2019-12,所以我需要根据MIN和Max Suffer-Exchange来生成十二月的排名。这个代码是按照我的要求工作的。
SELECT s1.avg_speed, s1.max_speed, s1.user_id,
@row_num:=IF(s1.avg_speed = @last_avg_speed, @row_num, @origin_row_num+1) rank_no,
@last_avg_speed:=s1.avg_speed last_avg_speed,
@origin_row_num:=@origin_row_num+1 origin_row_num
FROM (
SELECT SUM(avg_speed) avg_speed, SUM(max_speed) max_speed, user_id FROM workouts
WHERE date_created LIKE '2019-12%'
GROUP BY user_id
) s1, (SELECT @origin_row_num:=0, @row_num:=0, @last_avg_speed:=0) R
WHERE s1.avg_speed < 30 AND s1.max_speed < 50
ORDER BY s1.avg_speed DESC
create table workouts
(
id int auto_increment
primary key,
user_id int not null,
date_created date null,
activity_type varchar(10) null,
avg_speed float null,
max_speed float null
);
DELETE FROM workouts WHERE user_id IN (1, 2, 3)
INSERT INTO workouts (id, user_id, date_created, activity_type, avg_speed, max_speed)
VALUES (NULL, 1, '2019-12-01', 'Walk', 1, 10),
(NULL, 1, '2019-12-02', 'Walk', 1, 10),
(NULL, 1, '2019-12-03', 'Walk', 1, 10),
(NULL, 1, '2019-12-04', 'Walk', 1, 10),
(NULL, 2, '2019-12-01', 'Walk', 1, 10),
(NULL, 2, '2019-12-02', 'Walk', 5, 10),
(NULL, 2, '2019-12-03', 'Walk', 1, 10),
(NULL, 2, '2019-12-04', 'Walk', 1, 10),
(NULL, 3, '2019-12-01', 'Walk', 1, 10),
(NULL, 3, '2019-12-02', 'Walk', 5, 10),
(NULL, 3, '2019-12-03', 'Walk', 1, 10),
(NULL, 3, '2019-12-04', 'Walk', 1, 10);
SELECT s1.avg_speed, s1.max_speed, s1.user_id,
@row_num:=IF(s1.avg_speed = @last_avg_speed, @row_num, @origin_row_num+1) rank_no,
@last_avg_speed:=s1.avg_speed last_avg_speed,
@origin_row_num:=@origin_row_num+1 origin_row_num
FROM (
SELECT SUM(avg_speed) avg_speed, SUM(max_speed) max_speed, user_id FROM workouts
WHERE date_created LIKE '2019-12%'
GROUP BY user_id
) s1, (SELECT @origin_row_num:=0, @row_num:=0, @last_avg_speed:=0) R
WHERE s1.avg_speed < 30 AND s1.max_speed < 50
ORDER BY s1.avg_speed DESC
|--------------------------------------------------|
|avg_speed|max_speed|user_id|rank_no|last_avg_speed|
|--------------------------------------------------|
|8 |40 |2 |1 |8 |
|--------------------------------------------------|
|8 |40 |3 |1 |8 |
|--------------------------------------------------|
|4 |40 |1 |3 |4 |
|--------------------------------------------------|