我正在嘗試運行MySQL查詢以返回關於一組遊戲的最高分數的一些信息。該表設置了以下列:scoreid,score,gameid,playerid,日期。當我運行以下SQL命令時,它會給我適當的高分,但會返回第一個提交的playerid和日期。我在這裏做錯了什麼?MySQL查詢意外結果
SELECT date, MAX(score) as score, scoreid, playerid FROM scores GROUP BY gameid
我正在嘗試運行MySQL查詢以返回關於一組遊戲的最高分數的一些信息。該表設置了以下列:scoreid,score,gameid,playerid,日期。當我運行以下SQL命令時,它會給我適當的高分,但會返回第一個提交的playerid和日期。我在這裏做錯了什麼?MySQL查詢意外結果
SELECT date, MAX(score) as score, scoreid, playerid FROM scores GROUP BY gameid
你被遊戲ID分組,但你正在返回一些非聚集列(date
,scoreid
,playerid
)。 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。
你給我提供的第二個代碼是小竅門。謝謝! – Casey 2013-05-13 22:40:09
MAX(分數)不會得到具有最高分數的那一行。它將簡單地返回最高分,但所有其他字段可以簡單地屬於另一行。
你可以更好的嘗試:
SELECT date, score, scoreid, playerid FROM scores GROUP BY gameid HAVING score = MAX(score)
聽起來很像這是最近回答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
什麼'日期','scoreid','playerid'你想要在'max(score)'中有什麼聯繫時返回?每一行都是?武斷?所有可能性都合併爲一行? – gillyspy 2013-05-13 21:59:31
是一羣真正由'group by gameid'代表的遊戲嗎?單憑名稱'gameid'聽起來像是一個獨特的遊戲,但也可以代表一組遊戲,但是我不能說明沒有澄清 – gillyspy 2013-05-13 22:01:30