2010-02-06 5 views
0

Compte tenu d'une table:MySQL: ajout d'une colonne de position

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

Quelle requête puis-je utiliser pour régler de façon optimale les colonnes de position à l'aide de la colonne de score (non annulable)?

(je suis sûr que je l'ai vu avant, mais je ne peux pas sembler obtenir les bons mots-clés pour trouver!)

Répondre

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; 

de mettre à jour la position d'un seul coup qui ferait la tour. les scores égaux obtiennent la même position

+0

Ah, merci ça ressemble et 'rank' était le mot-clé que j'aurais dû utiliser plus tôt! – Pool

1

Calculez-le dans la langue que vous utilisez. Ainsi, votre solution sera:

  • plus portable
  • plus lisible
  • équivalente efficace
+0

Merci, mais je suis à la recherche d'une solution similaire à celle-ci: http://stackoverflow.com/questions/1600294/mysql-add-sequence-column-based-on-another-field – Pool

+0

J'essayais d'expliquer pourquoi une solution n'est pas préférable :) – Bozho

1
SELECT * FROM your_table ORDER BY score; 

Votre colonne de position semble être redondant, bien qu'il soit difficile de dire à partir des informations donné dans la question. La fonctionnalité que vous semblez vouloir est accomplie en utilisant l'ordre des lignes de la base de données, vu dans l'exemple ci-dessus avec l'expression 'ORDER BY'. Même si vous voulez une colonne de position pour une bonne raison, souvenez-vous que très probablement il existe un index pour la colonne de score de toute façon, ce qui ferait dans la plupart des cas exactement la même chose qu'une colonne de position. Soit ça, soit je comprends mal votre question.

+0

Merci amn, oui, la position est redondante mais j'ai besoin de l'utiliser pour l'optimisation. La colonne de position serait une valeur de position en cache, créée rarement. (Il est très coûteux de trier chaque fois que je souhaite obtenir la position, étant réglé toutes les 5 minutes par exemple est bien.) – Pool

+0

L'optimisation est bien mieux faite par le système de base de données lui-même, quand vous le dites explicitement pour indexer la colonne score en utilisant say l'expression SQL suivante: CREATE INDEX score_index ON your_table (score); – amn

+0

J'ai déjà le score sous forme d'index. – Pool

Questions connexes