2009-12-03 94 views
0

我有一個表user_idlap_time,我運行下面的查詢:訂購和在PHP分組/ MySQL的

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

該查詢會給你的最快圈速爲每USER_ID(其中lap_time低於57370),並用正確的記錄ID匹配起來。一般來說,連接mysql的性能比sub select要好一些。

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

我想你應該使用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)

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` 

此外,您查詢的格式是相當Ø verkill。沒有理由在查詢中只有一個表時創建表別名。除非你從一些爲你生成它的程序複製粘貼。

編輯

對不起,你是正確的 - 分鐘的時間並不總是匹配的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; 
+0

謝謝你,這個微小的問題tho,返回的id不是MIN的lap_time的id ...這種方式嗎? – designvoid 2009-12-03 15:44:15

+0

我是正確的,雖然這確實會爲該用戶返回最低單圈時間,但該行中的lap.id不是最低單圈時間的lap.id,我確實需要這一點。 – designvoid 2009-12-03 15:56:45