你可以试试这个 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
这是我的测试代码:
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 |
|--------------------------------------------------|
在最后一列last_avg_speed总是等于avg_speed,你可以忽略它。
顺便说一句,如果你使用的是 MySQL 8.0.0 或更高版本,你可以使用ROW_NUMBER() 和RANK() 函数来解决它,非常非常简单。 here 是文档。