Sipariş ve php gruplama / MySQL

4 Cevap php

I user_id ve lap_time ile bir tablo var ve ben aşağıdaki sorguyu çalıştırıyorum:

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

Kullanıcıların X daha hızlı ama sadece benzersiz olan tüm tur almak için çalışıyorum.

Yukarıdaki sorgu kullanıcıların üst tur dönmek, onun ben mantıklı eğer GROUP BY sipariş etmek gerekir gibi? Yok

Kullanıcılar, birçok tur olabilir, bu yüzden 10 tur daha hızlı X'ten orada olabilir ama onlar aynı kullanıcı tarafından her şeysin, bu yüzden sadece o kullanıcı için en iyi tur istiyorum.

Bu mantıklı ve umut biri yardımcı olabilir!

4 Cevap

Bu sorgu size her user_id için hızlı tur vermek (lap_time 57370 altında olduğu) ve doğru kayıt kimliği ile o kadar maç olacak. ve genel olarak, seçer yapılacak alt daha mysql ile biraz daha iyi bir performansa sahip katıldı.

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);

Var sorgu 57.370 daha düşük olduğunu her kullanıcı için her tur dönecektir. Sadece her kullanıcının en iyi tur istiyorsanız , sadece lap_time etrafında 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`

Also, you query formatting is pretty overkill. No reason to make a table alias when there's only one table in the query. Unless you copy-pasted this from some program that generated it for you.

DÜZENLEME

Üzgünüm, haklısın - dk zaman zaman kimliği ile maç olmayacak. Bu hile yapmak gerekir

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;

Bunu alana göre some_field, grup AS SELECT COUNT (*) kullanın ve kullanıcı başına üst sonuç almak için MAX kullanmak gerektiğini düşünüyorum.

Benzer durumlarla uğraşırken ben bu kullanıcı için daha hızlı bir zaman yoktur sağlamak için bir alt sorgu ekledim:

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)