Упорядочивание и группировка в php / MySQL - PullRequest
0 голосов
/ 03 декабря 2009

У меня есть таблица с 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

Я пытаюсь пройти все круги, которые быстрее, чем Х, но только уникальные пользователи.

Приведенный выше запрос не возвращает пользователей на верхний круг, похоже, мне нужно заказать GROUP BY, если это имеет смысл?

У пользователей может быть много кругов, поэтому они могут быть на 10 кругов быстрее, чем X, но все они принадлежат одному и тому же пользователю, поэтому я просто хочу, чтобы для этого пользователя был лучший круг.

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

Ответы [ 4 ]

1 голос
/ 03 декабря 2009

Ваш запрос будет возвращаться на каждом круге для каждого пользователя, который меньше 57370. Если вы хотите, чтобы каждый круг был только у лучшего пользователя, просто добавьте МИНУТ вокруг 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` 

Кроме того, форматирование вашего запроса довольно излишне. Нет причин создавать псевдоним таблицы, когда в запросе только одна таблица. Если вы не скопировали это из какой-либо программы, которая сгенерировала это для вас.

EDIT

Извините, вы правы - минимальное время не всегда совпадает с идентификатором. Это должно сделать трюк

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 голосов
/ 03 декабря 2009

Этот запрос даст вам самый быстрый круг для каждого user_id (где lap_time меньше 57370) и сопоставит его с правильным идентификатором записи. и вообще, соединения с 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);
0 голосов
/ 03 декабря 2009

При работе с подобными ситуациями я добавил подзапрос, чтобы у этого пользователя не было более быстрого времени:

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)

0 голосов
/ 03 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...