2013-03-08 151 views
-1

我有一個測試人們提交它,然後他們用來完成測試的秒數也被提交。SQL查詢沒有排序正確

這是查詢:

SELECT * 
FROM namethatchampion_stats 
GROUP BY user 
ORDER BY seconds ASC 
LIMIT 100 

這是表結構:

id | user | seconds | time 

我希望我的用戶能夠提交測試很多次,但此只列出他第一次提交。因此,如果用戶獲得更好的時間,他發佈的秒數不會在數據庫中使用該行,則只會使用用戶發佈的第一行。

+0

你想要每個學生的最高分數嗎?或者第一個?還是最後一個提交? – 2013-03-08 13:19:56

+0

秒列保存的數據和時間列保存的數據是什麼? – Eugene 2013-03-08 13:21:44

+0

我無法理解,mysql開發網站上有太多例子...太難以谷歌了嗎? – 2013-03-08 13:23:08

回答

0

您的ORDER BY聲明應使用包含提交測試日期的time列,而不是seconds。 (假設它包含一個完整的日期,如果只是時間,那麼這個時間會從窗口中消失)。

0

這將讓你爲每個用戶在最快的時間:你想要什麼

SELECT user, MIN(seconds) 
FROM namethatchampion_stats 
GROUP BY user 
LIMIT 100; 

是這樣嗎?

1

我想,你希望每一個學生的成績最好 - 這是「最好的」遊敏MIN(seconds)。如果這是你想要的,這裏是這樣的:

SELECT user, MIN(seconds) AS best_score 
FROM namethatchampion_stats 
GROUP BY user 
ORDER BY best_score ASC 
    LIMIT 100 ; 
2

我會建議,以避免由MySQL在可能情況下提供的隱含的分組,我的意思是,你的查詢已允許您選擇IDTimeseconds即使它們不包含在聚合函數或group by子句中。

在此聲明:

SELECT * 
FROM namethatchampion_stats 
GROUP BY User 
ORDER BY Seconds 

您是說給我一個行(隨機),爲每個用戶,然後按秒訂購這些隨機行中,所以即使你有順序的,這不影響分組:

MySQL Docs狀態

該服務器是可以自由選擇從每個組中的任何值,所以,除非它們是相同的,所選擇的值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。

因此,除非您的列從聚合中排除,並且組在功能上依賴於組中包含的列(例如主鍵),然後使用顯式分組。在您的方案以獲得所有從表中的行,你可以使用:

SELECT stat.ID, 
     stat.User, 
     stat.Seconds, 
     stat.Time 
FROM NamethatChampion_stats Stat 
     INNER JOIN 
     ( SELECT User, MIN(Seconds) AS Seconds 
      FROM NamethatChampion_stats 
      GROUP BY User 
     ) MaxStat 
      ON MaxStat.User = stat.User 
      AND MaxStat.Seconds = stat.Seconds 
ORDER BY Seconds ASC 
LIMIT 100 

Example on SQL Fiddle

上述方法的缺點是,如果一個用戶擁有2條具有相同最快的時間既會被退回。它需要進一步的聚合來移除這些重複項(您可能需要通過第一次或最後一次測試以相同的分數進行限制)。