我有一张包含user_id
和lap_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圈但是他们都是同一个用户,所以我只想要那个用户的最上一圈。
希望这是有道理的,有人可以提供帮助!
答案 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);