2010-12-06 3 views
3

저는 높은 점수 서버를 만들고 있으며, 필요한 기능 중 하나는 사용자의 현재 점수 주변의 높은 점수를 검색 할 수 있습니다. 그렇지 않으면 나는이 멋쟁이 일 것이라고 생각mysql의 마이너스 리미트 오프셋

SELECT * FROM highscores 
WHERE score >= (SELECT score FROM highscores WHERE userID = someID) 
ORDER BY score, updated ASC 
LIMIT -9, 19 

유일한 여기에 문제 LIMIT의 오프셋 매개 변수는 음수가 될 수 없다는 것입니다 : 저는 현재 다음있다. 결론적으로, LIMIT 오프셋에 음수 오프셋을 제공하는 트릭/방법이 있습니까? 아니면이 문제에 대해 더 좋은 방법이 있습니까?

+0

음수 오프셋을 사용해야하는 이유가 확실하지 않은 경우 ASC에서 DESC로 순서를 바꿀 수 있습니까? – ajreal

+0

그럼 같은 문제가 발생하지만 반대쪽에 있습니다. 플레이어가 리더 보드에서 순위가 ​​345이고, 순위가 ORDER BY 점수에서 암시되어 업데이트되었습니다 (오래된 점수 우선 순위 지정). 그런 다음 345-9 - 345 + 9 행을 검색해야합니다. LIMIT 절을 사용하여이 작업을 수행하는 방법을 찾을 수없는 것 같습니다. 이제는 음수 오프셋이 필요한 정렬 방식이 중요합니다. – Ylisar

답변

7

당신은 엉덩이 단일 선택 쿼리의 진짜 고통을, 아니면 그냥이 작업을 수행 할 수 있습니다 : 나는이 목록의 중간에, 그래서 지정된 사용자의 점수를 잡기 위해 조각에 던졌다

(SELECT * FROM highscores 
WHERE score <= (SELECT score FROM highscores WHERE userID = someID) 
ORDER BY score, updated ASC 
LIMIT 9) 
UNION 
(SELECT * FROM highscores 
WHERE score = (SELECT score FROM highscores WHERE userID = someID)) 
UNION 
(SELECT * FROM highscores 
WHERE score >= (SELECT score FROM highscores WHERE userID = someID) 
ORDER BY score, updated ASC 
LIMIT 9) 

. 필요한 경우 선택 사항입니다. 또한 SELECT *를 사용하지 말고 특정 필드를 사용하십시오. 선명도가 항상 바람직하며 성능이 현명합니다.

+0

노조 모두 < and > 연산자가 더 좋을 것입니다. :-) –

+0

이것은 트랙에 나를 가져옵니다,하지만 다음과 같은 문제가 있습니다 : 내가 100 점을 가지고 있고 50 번째 높은 점수의 양쪽에 9 점을 얻으려고한다고 말하게하십시오. 그래서 나는 40-60 점을 원한다. 위의 코드는 1-10과 50-60을 반환합니다. 도움? – themerlinproject

+0

@themerlinproject ORDER BY 점수 DESC 사용, 첫 번째 문장에서 ASC 업데이트 – SiXoS

관련 문제