У меня есть таблица с 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
, если это имеет смысл?
Пользователи могут иметь много кругов, поэтому на 10 кругов быстрее, чем X, но все они одни и те же, поэтому мне просто нужен верхний круг для этого пользователя.
Надеюсь, что это имеет смысл, и кто-то может помочь!
Этот запрос даст вам самый быстрый круг для каждого user_id (где lap_time ниже 57370) и сопоставьте его с правильным идентификатором записи. и, в общем, соединения имеют немного лучшую производительность с mysql, чем делают sub selects.
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);
Запрос, который у вас есть, будет возвращать каждый круг для каждого пользователя, который ниже 57370. Если вы хотите, чтобы у каждого пользователя был лучший круг, просто добавьте MIN вокруг lap_time
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`
Забастовкa > Кроме того, вы запрашиваете форматирование, довольно перебор. Нет причин создавать псевдоним таблицы, когда в запросе есть только одна таблица. Если вы не скопировали это из какой-либо программы, которая сгенерировала ее для вас.
ИЗМЕНИТЬ
Извините, вы правы - минимальное время не всегда совпадает с идентификатором. Это должно сделать трюк
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;
Я думаю, вы должны использовать SELECT COUNT (*) AS some_field, группу по этому полю и использовать MAX, чтобы получить максимальный результат для каждого пользователя.
При работе с подобными ситуациями я добавил дополнительный запрос, чтобы гарантировать, что для этого пользователя не будет более быстрого времени:
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)