2011-10-29 1 views
1

게임에서 "최고 점수"또는 "상위 10 점"을 업데이트하는 절차를 구현하고 싶습니다.IN 대신 LIMIT를 사용할 수 있습니까?

내 생각은 다음과 같은 코드를 실행하는 것입니다

DELETE FROM Highscore 
WHERE scoreId NOT IN 
    (SELECT scoreId FROM Highscore ORDER BY value DESC LIMIT 10) 

을하지만 그때 나는 내가 사용의 MySQL 버전이 LIMITIN를 지원하지 않는 오류가 발생합니다.

다른 방법이 있습니까?

답변

2

에 대한 다른 해결 방법 :

DELETE FROM Highscore 
WHERE scoreId NOT IN 
    (SELECT scoreId FROM Highscore ORDER BY value DESC LIMIT 10) 

다른 하위 쿼리 내부의 LIMIT와 하위 쿼리 묶어야하는 것입니다

DELETE FROM Highscore 
WHERE scoreId NOT IN 
    (SELECT scoreId FROM 
     (SELECT scoreId FROM Highscore ORDER BY value DESC LIMIT 10) 
     AS tmp 
    ) 

을하지만 나는 그것이 WHERE에서, 참조와 중첩 된 하위 쿼리를 결합하지 않는 것이 좋습니다 생각 절을 삭제하려는 동일한 테이블에 추가하십시오.나는 그것이 JOIN 사용하는 것이 좋습니다 생각 : 당신이 (value에 인덱스와 가능성이 신속하고) 그것을 간단하게 할 수 있다면 그것은 귀하의 경우 가능한 한,

DELETE h 
FROM 
     Highscore AS h 
    CROSS JOIN 
     (SELECT scoreId FROM Highscore ORDER BY value DESC LIMIT 10 
    ) AS tmp 
WHERE h.scoreId NOT IN (SELECT scoreId FROM tmp) 

또는 더 나은 (다음 유지 않습니다 10 번째 행에 넥타이가있는 경우 10 열 이상) :

DELETE h 
FROM 
     Highscore AS h 
    CROSS JOIN 
     (SELECT value 
     FROM Highscore 
     ORDER BY value DESC 
     LIMIT 1 OFFSET 9 
    ) AS tmp 
WHERE h.value < tmp.value 
+0

mhnm해야 작품 :) 아주 까다로운, 탱크 –

1

새 행을 삽입하는 대신 UPDATE을 사용하여 기존 행을 업데이트 할 수 있습니다.

또 다른 방법은 최고 점수를받는 선택을 편집하는 것입니다. 그렇게하면 이전의 모든 최고 기록을 계속 추적 할 수 있습니다. ORDER BYLIMIT을 사용하면 이러한 쿼리를 수행 할 수 있습니다.

+0

ru이 질문에 대한 답을 찾으셨습니까? –

+1

업데이트? 응? 점수가 가장 낮은 행? 나는 좋은 생각이라고 생각하지 않는다. 게임이 종료되면 모든 사람의 점수가 데이터베이스로 전송됩니다 (사람 수는 가변적입니다). 그래서이 경우에 UPDATE를 사용하는 방법을 모른다. –

+0

'DELETE'와 함께'LIMIT'을 사용할 수 있지만'OFFSET'을 사용할 수 없다. –

0

내가 MySQL의가이 테스트 설치할 필요는 없지만, TSQL에서 당신은 물론

delete from HighSchore 
where scoreID not in 
(select top 10 scoreID from HighScore order by Value desc) 

같은 것을 할 수있는, 그것은 외부로 대신 하위 쿼리의 조인을이 작업을 수행하는 것이 좋습니다.

내 생각에, 당신은 이런 식으로 데이터를 절대로 삭제해서는 안되며 필요할 때마다 상위 10 개를 검색하면됩니다. 마지막 5 어떤 수를 할 수

select top 10 value 
from Highscore 
order by Value desc; 
+0

mysql은 내부 쿼리 내에서 top/limit를 허용하지 않습니다. –

+0

@ItayMoav 심각하게? 누군가 다른 서버를 필요로 할 경우에 대비하여 여기에 남겨 두겠습니다. –

+2

우리 모두 ALL (mysql 사용자)은 곧이 문제가 해결되기를 바라고 있지만, 슬프게도 이것은 현재 존재하는 최신 버전에있을 수 있지만 아직 안정적이지는 못하다는 것을 확신합니다. –

3
DELETE FROM Highscore ORDER BY value DESC LIMIT 10,5 

. 스코어가 추가 될 때마다 이것을 실행하면 1이됩니다. 더 많은 여백을 허용하려면 10을 사용하십시오.

편집 : 죄송합니다. 여기서 오프셋을 사용할 수 없습니다. 이 경우 :

DELETE FROM Highscore WHERE value < (SELECT value FROM Highscore ORDER BY value DESC LIMIT 10,1) 

은 당신이 (/ 갱신으로 동일한 테이블에서 선택 삭제) 그렇게하지 않는 경우, 시도 :

SET @tmp = (SELECT value FROM Highscore ORDER BY value DESC LIMIT 10,1) 
DELETE FROM Highscore WHERE value < @tmp 

편집 다시 : 코멘트에 지적한 바와 같이 11 번째 값이 10 번째 일 경우 문제가 발생합니다. 시도 : 첫 번째 변수에 scoreId에 의해

SET @id = (SELECT scoreId FROM Highscore ORDER BY value DESC, scoreId DESC LIMIT 10,1), @val = (SELECT value FROM Highscore ORDER BY value DESC LIMIT 10,1) 
DELETE FROM Highscore WHERE value <= @val AND scoreId < @id 

주문이 보장이 거기에 남아있을 것입니다 (10) 못지 않게 같은 점수, 여러있을 때.

+0

'SET @tmp = (높은 값 ORDER BY 값 DESC LIMIT 10,1에서 값을 선택하십시오.) 하이 스코어에서 삭제 WHERE 값 <@ tmp' 예,이 작업은 약간 버그가 있습니다 (11 행이 10 행과 같은 값일 경우)) –

+0

아, 그게 좋은 지적입니다. 보다 강력한 쿼리로 수정합니다. –

+0

아 ... 물론 고마워요 :) –

0

시도해보십시오.

첫째, 사람들은 10

DELETE FROM Highscore WHERE scoreId NOT IN 
    (SELECT scoreId FROM tmp_highscores) 

그리고 IN, 잊지하지 NOT 삭제, 그리고

CREATE TEMPORARY TABLE tmp_highscores 
    (SELECT scoreId FROM Highscore ORDER BY value DESC LIMIT 10); 

10의 임시 테이블을 만들 : "scoreId 것은"에 색인한다 ' 최고 점수 '표

관련 문제