在php / MySQL中进行排序和分组

时间:2009-12-03 14:43:29

标签: php mysql group-by

我有一张包含user_idlap_time的表格,我正在运行以下查询:

SELECT `Lap`.`id`, `Lap`.`user_id`, `Lap`.`lap_time` 
FROM `laps` AS `Lap` 
WHERE `Lap`.`lap_time` < 57370 
GROUP BY `Lap`.`user_id` 
ORDER BY `Lap`.`lap_time` ASC

我试图获得比X更快的所有圈数,但只有唯一用户。

上面的查询不会返回用户的最高圈,就像我需要订购GROUP BY一样,如果这有意义的话?

用户可以有很多圈,所以可能比X快10圈但是他们都是同一个用户,所以我只想要那个用户的最上一圈。

希望这是有道理的,有人可以提供帮助!

4 个答案:

答案 0 :(得分:1)

对于每个低于57370的用户,您的查询将返回每一圈。如果您只想要每个用户的最佳圈数,只需在lap_time附近添加一个MIN

SELECT `Lap`.`id`, `Lap`.`user_id`, min(`Lap`.`lap_time`) as `best_lap_time`
FROM `laps` AS `Lap` 
WHERE `Lap`.`lap_time` < 57370 
GROUP BY `Lap`.`user_id` 

<击> 此外,您查询格式是相当矫枉过正的。当查询中只有一个表时,没有理由创建表别名。除非你从为你生成它的某个程序中复制粘贴它。

修改

对不起,您说得对 - 最短时间并不总是与ID匹配。这应该可以解决问题

select l.id
     , l.user_id
     , (select min(lap_time)
          from lap
         where lap_time < 57370 
           and user_id = l.user_id
       ) as best_lap_time
 group by l.user_id
having best_lap_time is not null
 order by best_lap_time asc;

答案 1 :(得分:0)

我认为你应该使用SELECT COUNT(*)AS some_field,按该字段分组并使用MAX来获得每个用户的最高结果。

答案 2 :(得分:0)

在处理类似情况时,我添加了一个子查询,以确保该用户没有更快的时间:

WHERE Lap.lap_time < 57370 AND NOT EXISTS (select 1 from laps where laps.user_id = Lap.user_id and laps.lap_time < Lap.lap_time)

答案 3 :(得分:0)

此查询将为每个user_id(lap_time低于57370)提供最快圈速,并将其与正确的记录ID进行匹配。一般来说,连接在mysql上的性能比子选择更好。

select l2.id,
       l1.user_id,
       l1.lap_time
  from lap l1
  inner join lap l2
     on l1.id = l2.id
  where l1.lap_time < 57370
  group by l1.user_id
  having min(l1.lap_time);