2013-05-13 225 views
1

我正在嘗試運行MySQL查詢以返回關於一組遊戲的最高分數的一些信息。該表設置了以下列:scoreid,score,gameid,playerid,日期。當我運行以下SQL命令時,它會給我適當的高分,但會返回第一個提交的playerid和日期。我在這裏做錯了什麼?MySQL查詢意外結果

SELECT date, MAX(score) as score, scoreid, playerid FROM scores GROUP BY gameid 
+0

聽起來很像這是最近回答http://stackoverflow.com/questions/16531573/select-the-database-getting-all-the-maximum-values-of-a-column/16531740#16531596 – gillyspy 2013-05-13 21:55:35

+0

什麼'日期','scoreid','playerid'你想要在'max(score)'中有什麼聯繫時返回?每一行都是?武斷?所有可能性都合併爲一行? – gillyspy 2013-05-13 21:59:31

+0

是一羣真正由'group by gameid'代表的遊戲嗎?單憑名稱'gameid'聽起來像是一個獨特的遊戲,但也可以代表一組遊戲,但是我不能說明沒有澄清 – gillyspy 2013-05-13 22:01:30

回答

1

你被遊戲ID分組,但你正在返回一些非聚集列(datescoreidplayerid)。 MySQL允許您通過查詢選擇組中的非聚合列,但這些列的值將不確定(它通常會返回遇到的第一個值,但沒有記錄,您不能依賴它)。 Score已彙總(您正在使用MAX()這是一個聚合函數),因此它的值將是正確的。

如果你想返回有你應該使用這樣的查詢最大比分的所有行:

SELECT date, score, scoreid, playerid 
FROM scores 
WHERE score = (SELECT MAX(score) FROM scores) 

,或者如果你想回到那個有每個遊戲ID的最大比分的行,像此:

SELECT date, score, scoreid, playerid 
FROM scores 
WHERE (gameid, score) IN (SELECT gameid, MAX(score) FROM scores GROUP BY gameid) 

請參閱小提琴here

+0

你給我提供的第二個代碼是小竅門。謝謝! – Casey 2013-05-13 22:40:09

3

MAX(分數)不會得到具有最高分數的那一行。它將簡單地返回最高分,但所有其他字段可以簡單地屬於另一行。

你可以更好的嘗試:

SELECT date, score, scoreid, playerid FROM scores GROUP BY gameid HAVING score = MAX(score) 
+0

爲什麼要返回其他字段('date'等),然後@ nl-x? – gillyspy 2013-05-13 22:03:11

+0

@gillyspy我不明白你的問題。 OP在他試圖獲得與max(分數)相關的其他字段的地方有查詢。我不知道他爲什麼想要擁有這些領域。 – 2013-05-13 22:05:04

+0

這可能會完全排除/跳過整個gameid(除非足球比分是1-0;))。我懷疑這是什麼運作需要。是的,我們需要更清晰。 – gillyspy 2013-05-13 22:06:40