【问题标题】:Group, count and concat laps分组、计数和连续圈数
【发布时间】:2014-11-17 02:49:34
【问题描述】:

我无法解决这个问题(比赛),我需要显示每圈的时间。这是时间表

 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                                | 

我头晕,求个思路

【问题讨论】:

    标签: mysql sql count group-by concat


    【解决方案1】:

    您可以通过简单的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;
    

    【讨论】:

    • 为什么要检查if(@t = time 两次?不应该只是if(@t = time, @rn + 1, 1)吗?
    • @sgeddes 。 . .您需要进行赋值,MySQL 不保证select 中表达式的求值顺序。因此,所有与变量有关的工作都放在一个表达式中。
    • @GordonLinoff -- 但是if(@t := time, 1, 1) 解决了什么问题?它总是评估为1。我只是建议将您的行号合并到if(@t = time, @rn + 1, 1)
    • @GordonLinoff -- 我终于明白了!您已使用 else 标准将值分配给 @t 并返回 1。我总是在单独的语句中设置我的值。 +1 解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多