我有mysql表“ runners”,需要从俱乐部获得最佳三个跑步者时间,并从这些跑步者获得排名俱乐部的结果。在下面的示例中。我尝试使用BY BY俱乐部,但是需要所有跑步者的成绩,而不是三项最佳成绩
示例表
id name club time
1 pero name1 12:11:01
2 marko name1 12:14:02
3 ante name1 12:18:05
4 josipa name1 12:05:02
5 iva name1 12:08:00
6 vijeko name2 12:25:01
7 alen name2 12:31:05
8 antonia name2 12:14:08
9 boris name2 12:15:19
10 miro name3 12:17:20
11 ines name3 12:18:20
12 robert name3 12:33:11
13 Ivana name3 12:08:00
14 Ana name3 12:01:05
总成绩最好的跑步者和排名俱乐部
josipa name1 12:05:02
snjezana name1 12:08:00
ante name1 12:18:05
Total time 36:31:07
Ana name3 12:01:05
Ivana name3 12:08:00
miro name3 12:17:20
Total time 36:26:25
antonia name2 12:14:08
boris name2 12:15:19
alen name2 12:31:05
Total time 37:00:32
在MySQL 8.0中,您可以为此使用窗口函数:
select *
from (
select t.*, rank() over(partition by club order by time) rn
from mytable t
) t
where rn <= 3
这里是使用通用表表达式生成汇总的一种方法:
with cte as (
select *
from (
select t.*, rank() over(partition by club order by time) rn
from mytable t
) t
where rn <= 3
)
(select name, club, time from cte)
union all (select name, 'Total time', sum(time) from cte group by name)
order by club, time
如果您使用的是mysql 5.6或5.7,则必须使用会话变量,并且比mysql 8难看一些
CREATE TABLE timetable ( `id` INTEGER, `name` VARCHAR(13), `club` VARCHAR(8), `time` TIME );
✓
INSERT INTO timetable (`id`, `name`, `club`, `time`) VALUES ('1', 'pero', 'name1', '12:11:01'), ('2', 'marko', 'name1', '12:14:02'), ('3', 'ante', 'name1', '12:18:05'), ('4', 'josipa', 'name1', '12:05:02'), ('5', 'iva', 'name1', '12:08:00'), ('6', 'vijeko', 'name2', '12:25:01'), ('7', 'alen', 'name2', '12:31:05'), ('8', 'antonia', 'name2', '12:14:08'), ('9', 'boris', 'name2', '12:15:19'), ('10', 'miro', 'name3', '12:17:20'), ('11', 'ines', 'name3', '12:18:20'), ('12', 'robert', 'name3', '12:33:11'), ('13', 'Ivana', 'name3', '12:08:00'), ('14', 'Ana', 'name3', '12:01:05');
✓
SELECT `name`, tta.`club`, `time`, totaltime FROM ( SELECT `name`, `time` ,IF(@club = `club`,@rnk := @rnk + 1,@rnk := 1) rnk ,@club := `club` `club` FROM (SELECT * FROM timetable ORDER BY club ASC,`time` ASC) tt, (SELECT @rnk := 0) a,(SELECT @club := '') b ) tta inner JOIN ( SELECT `club`, SEC_TO_TIME(SUM(TIME_TO_SEC(`time`))) as totaltime FROM ( SELECT `time` ,IF(@club = `club`,@rnk := @rnk + 1,@rnk := 1) rnk ,@club := `club` `club` FROM (SELECT * FROM timetable ORDER BY club ASC,`time` ASC) tt, (SELECT @rnk := 0) a,(SELECT @club := '') b) ttb WHERE rnk <= 3 GROUP BY `club` ) ttb ON tta.`club` = ttb.`club` WHERE tta.rnk <= 3
名称|俱乐部|时间|总时间:------ | :---- | :------- | :--------iva |名称1 | 12:08:00 | 36:24:03佩罗|名称1 | 12:11:01 | 36:24:03乔西帕|名称1 | 12:05:02 | 36:24:03antonia | name2 | 12:14:08 | 36:54:28鲍里斯| name2 | 12:15:19 | 36:54:28vijeko | name2 | 12:25:01 | 36:54:28安娜|名称3 | 12:01:05 | 36:26:25伊万娜|名称3 | 12:08:00 | 36:26:25miro |名称3 | 12:17:20 | 36:26:25
db <>小提琴here