2014-02-20 86 views
-1

我掙扎有點與查詢我試圖建立。對於我想要顯示得分前10的遊戲。顯示MAX值與加入

我的表看起來像這樣:

選手= ID,playername,用戶名 得分= ID,跟蹤,汽車,bestscore,totalscore,player_id(外鍵player.id)

對於TOP10我想顯示玩家名稱,總分,汽車和賽道。

當前查詢我的是:

SELECT p.playername, MAX(s.totalscore) totalscore, s.car, s.track 
FROM player p 
INNER JOIN score s on p.id = s.player_id 
GROUP BY p.playername 
ORDER BY MAX(s.totalscore) DESC 
LIMIT 10 

這似乎是做工精細,除了一個問題。如果用戶在軌道1分50與汽車1,然後把比分60在軌道1車2,我看到車1上查詢。它似乎並沒有得到最高分的相關車,如果這個用戶。

我希望這是有道理的什麼,我只是告訴。

提前致謝!

編輯:

SELECT p.playername, MAX(s.totalscore) as totalscore, s.car, s.track 
FROM (SELECT * FROM score ORDER BY totalscore DESC) s 
INNER JOIN player p ON s.player_id = p.id 
GROUP BY p.playername 
ORDER BY MAX(s.totalscore) DESC 
LIMIT 10 

此查詢,似乎這樣的伎倆。我一直在嘗試,結果集正是我的意思。它有什麼好處?我不善於使用SQL,僅僅因爲它的作用並不總是意味着它很好,是嗎?

+3

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

+0

對不起,我不知道你的意思。我對SQL很陌生,以普通語言來取悅。 – Bose321

+0

你也是google新手? – Strawberry

回答

0

當你有一個非聚集域作爲一個聚合的查詢,是不是你的小組通過,並具有許多與在其上進行分組的關係,一個關係的一部分,MySQL的不保證它會返回。

該查詢將另一個RDBMS拋出一個錯誤。如果你關心(人,車)元組的最高分,只需將它添加到組中。但是,如果您希望每個玩家獲得最高分數,無論使用哪輛車,您都需要一個子查詢或一個自加入。

一種方式做到這一點:

SELECT p.playername, s1.totalscore , s1.car, s1.track 
FROM player p 
INNER JOIN 
score s1 on p.id = s1.player_id 
WHERE s1.totalscore = (SELECT MAX(totalscore) FROM score s2 WHERE s2.player_id=s1.player_id) 
ORDER BY s1.totalscore DESC 
LIMIT 10 
+0

這似乎是我現在將汽車添加到GROUP BY時的問題。你能幫助我的子查詢?我對查詢很陌生。 – Bose321

+0

感謝編輯。然而,當我嘗試運行我得到這個錯誤:#1054 - 未知列「s1.total_score」在「where子句」 – Bose321

+0

應該是totalscore-你列的名稱。編輯以反映這一點。 – Anov

0

您可以使用「集團通過」關於playername因此其他列將在「什麼mysql的desides」組的方式。如果你想得到你應該添加的汽車 - 汽車組。

SELECT p.playername, MAX(s.totalscore) totalscore, s.car, s.track 
FROM player p 
INNER JOIN score s on p.id = s.player_id 
GROUP BY p.playername, s.car //added car 
ORDER BY s.totalscore DESC 
LIMIT 10 
+0

感謝您的快速回復。這似乎解決了這個問題。但是:現在,當用戶有多個分數時,用戶會多次出現。任何方式只顯示用戶的最高分數? – Bose321