Порядок и группировка в php / MySQL

0

У меня есть таблица с 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, но все они одни и те же, поэтому мне просто нужен верхний круг для этого пользователя.

Надеюсь, что это имеет смысл, и кто-то может помочь!

Теги:
order
group-by

4 ответа

0
Лучший ответ

Этот запрос даст вам самый быстрый круг для каждого 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);
1

Запрос, который у вас есть, будет возвращать каждый круг для каждого пользователя, который ниже 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;
  • 0
    Спасибо за это, небольшая проблема, но возвращаемый идентификатор не является идентификатором MIN lap_time ... в любом случае?
  • 0
    Я был прав, хотя это и возвращает наименьшее время круга для этого пользователя, lap.id в строке НЕ является lap.id наименьшего времени круга, и мне это действительно нужно.
0

Я думаю, вы должны использовать SELECT COUNT (*) AS some_field, группу по этому полю и использовать MAX, чтобы получить максимальный результат для каждого пользователя.

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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню