2012-06-05 17 views
1

我知道我可以在代碼中做到這一點,但我很好奇,如果有一個直接的SQL的方式除了你的查詢相匹配的選擇(例如)10個結果......是否有可能獲得圍繞特定匹配結果的一系列結果?

所以,讓我們說我有一個所有人都有分數的球員數據庫,我想向一個用戶展示一個用戶,他們的分數落後於他們,而前面的5個球員......所以,我選擇了他們的隊列,但現在我應該只用一個或一個在哪裏條款和這樣說......

select score as selectedScore from player_scores where playerId = xxxx 
or (score > selectedScore - 5 and score < selectedScore + 5) 

我意識到,這意味着所有的分數都按正確的順序,我會修改查詢拉從這些分數的用戶id,所以這只是一個僞例爲了o問題。

我懷疑這會行得通,但是,正確的方法來解決這個問題?

回答

1

您可以使用UNION來組合使用ORDER BYLIMIT分別選擇下一個5和前5個的兩個查詢;在每個查詢使用自聯接,可以發現鄰近期望玩家的得分全部其他球員(假定playerId是獨特的player_scores不過):

(
    SELECT p1.playerId, p1.score 
    FROM  player_scores AS p1 JOIN player_scores AS p2 ON p1.score >= p2.score 
    WHERE p2.playerId = ? 
    ORDER BY p1.score ASC 
    LIMIT 6 
) UNION ALL (
    SELECT p1.playerId, p1.score 
    FROM  player_scores AS p1 JOIN player_scores AS p2 ON p1.score < p2.score 
    WHERE p2.playerId = ? 
    ORDER BY p1.score ASC 
    LIMIT 5 
) 
+0

哦......那是非常好的。我認爲你必須刪除AND,否則它將需要playerId = xxxxx,這隻適用於THAT玩家,而不是後面和前面的5個,對吧? –

+0

@ Dr.Dredel:我的誤解;看到我上面修改的答案。說實話,儘管你可以直接將這兩個查詢與應用程序分開。 – eggyal

相關問題