2009-07-16 4 views
2
CREATE TABLE item (link MEDIUMINT UNSIGNED PRIMARY KEY NOT NULL, 
        title TEXT NOT NULL, 
        rank INT UNSIGNED NOT NULL AUTO_INCREMENT, 
        notes TEXT 
        ) ENGINE = INNODB; 

J'ai des problèmes pour implémenter ceci. rank est un classement donné par l'utilisateur qui peut être modifié à tout moment, et les éléments peuvent être ajoutés et supprimés à tout moment. Le problème est que je voudrais que les rangs soient uniques, et toujours ordonnés entre 1 et n (n étant le nombre de rangées dans la table). IE: Si un utilisateur change le rang de l'article 5 à 2. L'article de rang 2 précédent deviendra le rang 3, le rang précédent 3 passera au rang 4, et le rang 4 deviendra le nouveau rang 5. De même, pour supprimer et créer , tous les objets classés plus grands ou plus petits devraient descendre en cascade l'un ou l'autre de l'opération.Méthode MySQL pour maintenir la liste "top n" séquentiellement numérotée

Y at-il une sorte de modèle ou de technique pour mettre en œuvre facilement cela?

Merci pour toute aide,

Michael

Répondre

0

Vous pouvez garder vos objets dans une liste chaînée:

id parent title notes 

1 0  Title 1 Note 1 
2 1  Title 2 Note 2 
3 2  Title 3 Note 3 
4 3  Title 4 Note 4 

et requête comme ceci:

SELECT lv.* 
FROM (
     SELECT @r AS _parent, 
       @r := (
       SELECT id 
       FROM t_list 
       WHERE parent = _parent 
       ) AS id 
     FROM (
       SELECT @r := 0 
       ) vars, 
       t_list 
     ) li 
JOIN t_list lv 
ON  lv.id = li.id 

Déplacement d'un élément (ou même un bloc d'objets) dans cette conception ne prend que trois opérations UPDATE (vous cha nge les parents de l'objet que vous déménagez, de l'objet sur lequel vous vous déplacez et de l'objet que vous quittez).

Voir cet article dans mon blog pour les détails:

Questions connexes