2011-03-04 5 views
-1

Ceci est une question MySQL:Réindexer une colonne de position dans mysql

J'ai une table avec la structure suivante. Chaque article est censé avoir une position, et chaque position ne doit être utilisée qu'une seule fois. Les positions devraient augmenter (donc s'il y a 40 items alors les positions devraient aller de 1-40).

Cependant les données de ce tableau sont partout (la même position étant utilisée plus d'une fois, certaines lignes sans position). Je voudrais réinitialiser la table en réindexant les positions. Je voudrais respecter les ordres existants (même s'ils ne sont pas parfaits) en faisant cela (si possible - sinon les positions peuvent être écartées).

------------------------------------------------------ 
| reference  |  position  | parent  | 
|-----------------|--------------------|--------------| 
|ASHDFNS   |2     |89   | 
|BSHDFNS   |2     |89   | 
|CSHDFNS   |1     |89   | 
|DSHDFNS   |100     |89   | 
|ESHDFNS   |8     |89   | 
|FSHDFNS   |22     |89   | 
|ASHDFNS   |1     |11   | 
|BSHDFNS   |22     |11   | 
|CSHDFNS   |333     |11   | 
|-----------------|--------------------|--------------| 

désiré

------------------------------------------------------- 
| reference  |  position  | parent  | 
|-----------------|--------------------|--------------| 
|CSHDFNS   |1     |89   | 
|ASHDFNS   |2     |89   | 
|BSHDFNS   |3     |89   | 
|ESHDFNS   |4     |89   | 
|FSHDFNS   |5     |89   | 
|DSHDFNS   |6     |89   | 
|ASHDFNS   |1     |11   | 
|BSHDFNS   |2     |11   | 
|CSHDFNS   |3     |11   | 
|-----------------|--------------------|--------------| 

EDIT: Désolé, il suffit d'incrémenter automatiquement la colonne de position ne fonctionne pas comme le tableau décrit les positions des éléments dans plusieurs parents (et les articles peuvent avoir plus d'un parent)

+0

Pourquoi voulez-vous cela? Il y a des scénarios où cela pourrait être souhaitable (par exemple, que votre disque dur lise des sektors consécutifs sur le disque pour des lignes consécutives) mais cela est très micro-optimisant. Un bon index fera 99% du travail pour vous, l'ordre interne n'est vraiment pas important. – Konerak

+0

La commande est significative - elle a un sens en soi dans le système. J'ai édité ma question pour enlever l'index (qui n'est pas pertinent à la question). Merci – calumbrodie

+0

Pourquoi le downvote? – calumbrodie

Répondre

1

créer une table avec le schéma similaire, mais rendre la position de colonne comme auto_increment

après insertion de l'ordre ancienne_table quel que soit l'ordre yo u désir

insert into new_table select reference, 0, parent from old_table 
order by if (position is null, 99999, position); 

après, renommer ancienne_table, renommer new_table à ancienne_table

Dans le cas contraire, définir une variable d'utilisateur pour représenter la position

comme cela - update and select the same table problem in mysql

ou ce - Updating column so that it contains the row position

+0

Merci pour votre réponse - cela fonctionnerait pour l'exemple que j'ai donné - mais je cherchais une déclaration que je pourrais exécuter. Il y a une complexité supplémentaire qui signifierait que cela ne fonctionnerait pas dans mon cas. Désolé de ne pas inclure ceci dans la question originale - Je vais l'éditer maintenant pour mieux expliquer – calumbrodie

+0

Merci pour votre réponse – calumbrodie

Questions connexes