2013-01-16 135 views
0

我試圖從一個名爲遊戲的表格中選出前三名,這些表格有玩家的外鍵和主持人和對手的個人比分的2個整數。MySQL查詢排序高分

查詢:

SELECT 
    games.id, games.host_score, games.opponent_score, player.name 
FROM games, player 
WHERE player.id = games.host_player_id 
     || player.id = games.opponent_player_id 
ORDER BY games.host_score, games.opponent_score DESC LIMIT 3 

查詢完成,但它回來了亂序:

id host_score opponent_score name 
17 0   0    Temp2 
17 0   0    Temp0 
16 770   930    Temp0 

當我運行一個查詢,不具有或它的工作原理。我怎樣才能使這種方法工作?

也有一種方法來設置50的限制,但不計算重複? 例如,如果我想的2,但3人的限制有50分和2人有得分20它將返回:

id host_score opponent_score name 
17 50   0    Temp2 
17 50   0    Temp0 
17 50   0    Temp1 
17 20   0    Temp3 
17 20   0    Temp4 

或者它會更好地運行在PHP中單獨quesies?

+0

是什麼讓你認爲出了故障? (0,0,770)看起來像是按主機得分遞增的順序... –

+0

不要使用'||'和'&&'。 SQL中有'OR'和'AND'。 –

回答

0

如果您想訂購從最高到最低,你需要指定它爲每個字段

ORDER BY games.host_score DESC, games.opponent_score DESC 

因爲當你不指定要升序

0

你它假定訂單應該在SQL中使用OR(而不是||),並添加括號以使其可讀。

WHERE (player.id = games.host_player_id) OR (player.id = games.opponent_player_id) 

要獲得評分值前50的分數,儘管返回的總行數可能會更高。 使用下面的準系統查詢並調整它以滿足您的需求。

SELECT g1.id, g1.host_scores, COUNT(g2.host_scores) AS Rank 
FROM games g1 
WHERE Rank <= 50 
JOIN games g2 ON (g1.host_scores < g2.host_scores) OR (g1.host_scores=g2.host_scores) 
GROUP BY g1.id, g1.host_scores 
ORDER BY g1.host_scores DESC; 

我要補充的是,這樣的事情,以避免複雜性,你還可以將數據獲取到您的 應用程序,輕鬆地在編程語言如Java,PHP等,這樣做 它可能會導致你在做多一個查詢,但是更簡單,並且隨着時間的推移可以更容易維護。

+0

這工作lbu謝謝,我做了或更改。 @mk我確實需要重複。我希望得到50個最高分的所有結果。所以可能會有超過50人被退回。 –

+0

好的,我看到了,我在編輯我的回覆。 – rnk

0

我認爲你的查詢是錯誤的,因爲一個遊戲將在兩行 - 一個用於主機,一個用於對手。

你想獲得主機和對手的名字,所以你需要兩次加入到player表:

SELECT g.id, g.host_score, g.opponent_score, hp.name as HostName, op.name as OpponentName 
FROM games g join 
    player hp 
    on hp.id = g.host_player_id join 
    player op 
    on op.id = g.opponent_player_id 
ORDER BY g.host_score, g.opponent_score DESC 
LIMIT 3 
+0

我同意@Gordon Linoff,在行動中看到它:http://www.sqlfiddle.com/#!2/06faf/42 –