2013-06-03 1 views
1

하나 개의 문장으로 하위 범주를 가지고 MySQL의 테이블에 순위 높은 번. 기본적으로 두 개의 PlayerID가있는 경우 : PlayerID 3의 시간은 10.1 초이고 PlayerID 4의 시간은 10.3 초이며 PlayerID 3은 2 포인트를 얻고 PlayerID 4는 PlayerID 3의 시간이 나빠서 1 포인트를 얻습니다. 플레이어 ID가 4 개인 경우 1 위 시간의 선수는 4 점을 얻게되고 그 다음 최고 시간은 1 점씩 내려갑니다. 이 모든 것은 기본적으로 역순으로 순위가 1 순위가 아니라 최상위 순위를 얻는 것입니다.UPDATE 내가 가진 선수보다 더 많은 포인트가 있어야합니다 <em>낮은</em> 시간 (시간)와 필드</p> <pre><code>MapID | Type | Style | PlayerID | Time | Points </code></pre> <p>플레이어 (PlayerID)와 함께 시간을 테이블을 불렀다

내 모든 프로그램을 하나의 문장으로 작성해야하는 이유는 내 프로그램을 작성하는 언어가 Sourcepawn 쿼리에 구분 기호 (;)를 사용할 수 없습니다. 그리고 하위 카테고리를 언급하는 이유는 MapID, 유형, 스타일의 모든 조합이 자체 하위 카테고리라는 것입니다. 여기

더 쉽게 내 문제를 설명하는 이미지입니다 : http://i.imgur.com/W8d90P4.png 난 그냥의 mapId에 따라 같은 점을 분류하려면를, 유형, 스타일 및 시간은 SQLite는 함께 일하기 전에 해결책을 마련 않았다 를 주문했다 :

UPDATE times 
SET Points = (
    SELECT t1.Rank 
    FROM (
     SELECT t1.id, count(*) AS Rank 
     FROM times AS t1, times AS t2 
     WHERE t1.MapID=t2.MapID 
      AND t1.MapID=%d 
      AND t1.Type=t2.Type 
      AND t1.Type=%d 
      AND t1.Style=t2.Style 
      AND t1.Style=%d 
      AND t1.Time <= t2.Time 
     GROUP BY t1.PlayerID 
     ORDER BY t1.Time 
    ) AS t1 
    WHERE t1.id=times.id 
) 
WHERE MapID=%d AND Type=%d AND Style=%d 
+0

SQLite의 솔루션은 무엇입니까? 나는 그것이 MySQL과 함께 작동하도록 수정 될 수 있다고 확신한다. – Oswald

+0

"UPDATE times SET Points = (SELECT t1.ROWID, count() SELECT t1.ROWID, count() AS는 AS t1 시간, AS t2는 t1.MapID = t2.MapID 및 t1.MapID = % d AND t1 시간을 계승합니다. 유형 = t2.Type AND t1.Type = % d AND t1.Style = t2.Style AND t1.Style = % d AND t1.Time <= t2.Time GROUP BY t1.PlayerID ORDER BY t1.Time) AS t1 WHERE t1.ROWID = times.ROWID) MapID = % d 및 유형 = % d AND 스타일 = % d "매우 부피가 크지 만 효과가있었습니다. 얼마나 부피가 크고 동일한 변수가 여러 번 필요합니다. – user2447067

답변

0

AUTO_INCREMENT 열을 테이블에 추가하십시오. 이 열은 SQLite 데이터베이스에서 암시적인 ROWID 열의 역할을 수행 할 수 있습니다.

+0

좋아요, 지금은 ROWID가 id라고 할 때마다 수정 했으므로 count()를 count (*)로 변경해야했습니다. 이제는 수동으로 컨트롤 패널에서 직접 쿼리를 실행하는 경우에만 쿼리가 작동하는 이상한 문제가 발생합니다. 내 프로그램을 통해 그렇게한다면, "그 같은 열은 없습니다 : t1.id"라고 말합니다. 첫 번째 게시물의 쿼리에서 5 번째 줄에있는 것이 맞습니다. 하지만 그 같은 진술에서 시간 AS t1을 선언한다면 그렇게 작동하지 않아야합니까? – user2447067

+0

그러면 프로그램에 버그가 있거나 다른 데이터베이스를 사용하고 있습니다. – Oswald

+0

고마워, 그게 문제 야. 실수로 잘못된 데이터베이스를 사용하고있었습니다. SQLite에서 MySQL로 연결 방법을 변경하는 것을 잊었습니다. 문제는 지금 해결되었습니다. – user2447067