2010-02-06 2 views
0

를 추가 :MySQL의 : 테이블을 감안할 때 위치 열

id | score | position 
===================== 
1 | 20 |  2 
2 | 10 |  3 
3 | 30 |  1 

어떤 쿼리 내가 최적 (Null 허용되지 않음) 점수 열을 사용하여 위치 열을 설정하는 데 사용할 수있는?

은 (내가 전에 본 적이 확신하지만 난 그것을 찾기 위해 올바른 키워드를 얻이 수없는 것!)

답변

3
set @rank = 0; 
update tbl a join (select score, @rank:[email protected]+1 as rank from tbl group by score 
    order by score desc) b on a.score = b.score set a.position = b.rank; 

할 것 일거에 위치를 업데이트 장난. 동등한 점수는 같은 위치가됩니다

+0

아, 고맙습니다. 'rank'는 이전에 사용해야했던 키워드였습니다! – Pool

1

사용중인 언어로 계산하십시오. 따라서 솔루션은 다음과 같습니다

  • 더 휴대용
  • 더 읽기
  • 동등하게 효율적인
귀하의 위치 열이 정보에서 얘기하기 어렵다하지만, 중복 것으로 보인다
+0

고마워,하지만 난이 비슷한 솔루션을 찾고 있는데 : http://stackoverflow.com/questions/1600294/mysql-add-sequence-column-based-on-another-field – Pool

+0

나는 왜 그러한 힌트를하려했다. 해결책은 그다지 바람직하지 않습니다. :) – Bozho

1
SELECT * FROM your_table ORDER BY score; 

질문에 주어진다. 위의 예에서 'ORDER BY'표현식을 사용하여 데이터베이스 행 순서를 사용하여 원하는 기능을 수행 할 수 있습니다. 어떤 좋은 이유로 포지션 칼럼을 원한다고하더라도, 어쨌든 스코어 칼럼에 대한 인덱스가 존재할 가능성이 가장 높습니다. 대부분의 경우 포지션 칼럼과 똑같은 일을합니다. 그 또는 나는 당신의 질문을 완전히 오해합니다.

+0

감사합니다. amn, yes, position은 중복되었지만 최적화를 위해 사용해야합니다. 위치 열은 자주 생성되는 위치의 캐시 된 값입니다. (위치를 얻으 려 할 때마다 정렬하는 것이 매우 비쌉니다. 예를 들어 5 분마다 설정하는 것이 좋습니다.) – Pool

+0

점수 열을 색인하도록 명시 적으로 말하면 데이터베이스 시스템 자체가 최적화를 수행하는 것이 훨씬 낫습니다. 다음 SQL 표현식을 사용하십시오. CREATE INDEX score_index ON your_table (score); – amn

+0

나는 이미 색인으로 점수를 가지고 있습니다. – Pool