2014-09-23 68 views
1

我无法解决这个问题(比赛),我需要显示每个LAP的时间。这是多次表组,计数和连续圈

id | race_id  | car_num | time  | 
+-----+-------------+---------+------------+ 
1  | 8   | 25  | 00:09:05 | 
2  | 8   | 33  | 00:09:35 | 
3  | 8   | 10  | 00:09:55 | 
4  | 8   | 25  | 00:18:15 | 
5  | 8   | 33  | 00:19:05 | 
6  | 8   | 25  | 00:39:45 | 

我尝试此查询:

SELECT 
    car_num, COUNT(car_num) as laps, race_id, concat(vlap,'-',time) as times 
FROM 
    (SELECT num_car, concat(time,'-',v1) vlap 
    FROM tiempos) vti 
GROUP BY 
    car_num 

这是必需的输出:

car_num | laps  | race_id | times          | 
+-----+-------------+---------+------------------------------------------------+ 
25   | 3  | 8  | lap1 00:09:05, lap2 00:18:15, lap3 00:39:45 | 
33   | 2  | 8  | lap1 00:09:35, lap2 00:19:05     | 
10   | 1  | 8  | lap1 00:09:55        | 

我晕,一些想法,请

回答

2

你可以得到大部分你想要的都是简单的group_concat()

select car_num, count(*) as laps, race_id, group_concat(time order by id separator ', ') as times 
from tiempos t 
group by car_num, race_id; 

如果你需要的圈数,你可以得到使用变量:

select car_num, count(*) as laps, race_id, group_concat('lap', rn, ' ', time order by id separator ', ') as times 
from (select t.*, 
      (@rn := if(@t = time, @rn + 1, 
         if(@t := time, 1, 1) 
         ) as rn 
     from tiempos t cross join 
      (select @rn := 0, @t := '') vars 
     order by race_id, car_num, time 
    ) t 
group by car_num, race_id; 
+0

谢谢朋友!!!!已解决 – 2014-09-23 02:30:48

+0

为什么要检查'if(@t = time'两次?不应该只是'if(@t = time,@rn + 1,1)'? – sgeddes 2014-09-23 02:31:38

+1

@sgeddes ...您需要完成这项任务,MySQL并不保证表达式在'select'中的评估顺序,因此,所有与这些变量相关的工作都被放入一个表达式。 – 2014-09-23 03:03:05