2014-04-28 89 views
0

我有一個MySQL數據庫,其中有很多高分值的遊戲。我想獲得最高分值的「個人最佳」入場券。在MySQL中獲取最大值的條目

我發現了一個我認爲可以工作的解決方案,直到我在數據庫中獲得更多名稱,然後它返回完全不同的結果。

我迄今爲止代碼:

SELECT name, score, date, version, mode, custom 
FROM highscore 
WHERE score = 
    (SELECT MAX(score) 
      FROM highscore 
      WHERE name = 'jonte' && gamename = 'game1') 

對於很多價值,這實際上返回正確的值,例如:

JONTE 240 2014-04-28 02:52:33 1 0 2053  

它好工作與幾百項,有的用不同名。但是,當我添加新條目並將名稱換成'gabbes'時,對於新名稱,我會得到多個條目的列表。我沒有看到這裏的邏輯,因爲數據庫中的條目看起來與數據中的某些差異完全相同。

JONTE 176 2014-04-28 11:03:46 1 0 63 
GABBES 176 2014-04-28 11:09:12 1 0 3087  

上面有兩個條目,但有時它也可能會返回連續10-20個條目。

任何幫助?

+0

考慮提供適當的DDL(和/或sqlfiddle)與期望的結果集合在一起。 – Strawberry

+0

那麼,你的桌子可以有多個條目,其分數等於最大值。這種情況下你想要的輸出是什麼? – Guneli

回答

1

如果你想爲每個人的高分(即個人最好成績),你可以做到這一點...

SELECT name, max(score) 
FROM highscore 
WHERE gamename = 'game1' 
GROUP BY name 

或者,您也可以做到這一點...

SELECT name, score, date, version, mode, custom 
FROM highscore h1 
WHERE score = 
    (SELECT MAX(score) 
      FROM highscore h2 
      WHERE name = h1.name && gamename = 'game1') 

注意:在您的SQL中,您的子條款缺少謂詞name = h1.name

但請注意,如果第二個選項多次記錄相同的高分,則同一個人將獲得多行。

+0

第一個解決方案我早期做了什麼,它只適用於每個名稱的最高分,但如果我需要該條目的其他字段則不適用。 (例如,自定義值不是那個連接到那個分數的那個) 你的第二個解決方案似乎正在做我正在尋找的東西,所以非常感謝! – jsmars

+0

爲什麼這樣的請求會異常緩慢?自從我做出這些更改後,請求可能需要幾秒鐘..我的其他請求很快就會通過。在phpMyAdmin中運行這個過程可能需要一分鐘,而其他時間則需要0.0002秒。數據庫有幾千個條目。 – jsmars

+0

不應該花很長時間。你有名字欄的索引嗎?先嚐試一下。如果仍然很慢,請將索引添加到分數列中。我希望查詢時間少於1秒。 – xagyg

0

由於多個條目具有相同的高分,所以返回多個條目。您可以添加LIMIT 1以獲取單個條目。您可以選擇使用ORDER BY條款返回哪個條目。