Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php中基于两个值查找排名?_Php_Mysql - Fatal编程技术网

如何在php中基于两个值查找排名?

如何在php中基于两个值查找排名?,php,mysql,Php,Mysql,我有一个php中与训练相关的web应用程序,其中包含训练表,该表根据活动类型(如跑步、游泳、骑自行车等)存储用户的每日训练数据。我需要生成一个排行榜的排名系统为基础的高 选择 求和(平均速度)作为平均速度, 总和(最大转速)作为最大转速, 创建日期, 用户id 从训练中 其中创建的日期为“%2019-12%” 按用户id分组 通过此查询,我得到如下输出: 我需要的输出应该基于平均速度尝试这样玩查询 select user_id,avg,max from users nu join (

我有一个php中与训练相关的web应用程序,其中包含训练表,该表根据活动类型(如跑步、游泳、骑自行车等)存储用户的每日训练数据。我需要生成一个排行榜的排名系统为基础的高

选择
求和(平均速度)作为平均速度,
总和(最大转速)作为最大转速,
创建日期,
用户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             |
|--------------------------------------------------|