Si je le tableau suivant & données pour nous permettre d'utiliser le sort_index
pour le tri:MySQL mettre à jour une colonne d'index de tri pour déplacer des éléments
CREATE TABLE `foo` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`bar_id` INT(11) DEFAULT NULL,
`sort_index` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `foo` (`bar_id`, `sort_index`) VALUES
(1,1),(1,2),(1,3),(1,4),
(2,1),(2,2),(2,3),(2,4),(2,5);
Je veux être en mesure de faire ce qui suit dans le plus efficace manière:
- Déplacer une entrée de foo à une position donnée (scope par le bar_id)
- Assurez-vous que le
sort_index
est toujours 1 indexé et n'a pas les lacunes - Vous devriez être en mesure de déplacer des éléments au début et à la fin de la liste et la règle n ° 2 doit encore être appliqué
- Il devrait être entièrement fait dans les requêtes et aussi peu que possible (que les ensembles peuvent être très grandes et en boucle sur les faire
UPDATE
individuels s est pas idéal)
- Assurez-vous que le
pour clarifier ce que je suis en train de faire, laisse supposer la table était vide donc nous avons la les données suivantes:
id | bar_id | sort_index
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 1 | 4
5 | 2 | 1
6 | 2 | 2
7 | 2 | 3
8 | 2 | 4
9 | 2 | 5
Ensuite, si nous devions faire les mouvements suivants
- foo 1 à sort_index 3
- foo 7 à sort_index 1
- foo 5 à sort_index 5
Nous devrions obtenir le les données suivantes:
id | bar_id | sort_index
1 | 1 | 3
2 | 1 | 1
3 | 1 | 2
4 | 1 | 4
5 | 2 | 5
6 | 2 | 2
7 | 2 | 1
8 | 2 | 3
9 | 2 | 4
Et SELECT * FROM foo ORDER BY bar_id, sort_index;
nous donne:
id | bar_id | sort_index
2 | 1 | 1
3 | 1 | 2
1 | 1 | 3
4 | 1 | 4
7 | 2 | 1
6 | 2 | 2
8 | 2 | 3
9 | 2 | 4
5 | 2 | 5
Pour clarifier votre question: étant donné les insertions ci-dessus, vous voulez insérer une autre ligne avec 'bar_id' = 1 au début, entraînant des mises à jour (de la colonne' sort_index') de toutes les lignes suivantes où 'bar_id' est 1? – tangens
Pour résumer vos besoins, pour tout ensemble de "bar_id", le sort_index DOIT partir de zéro et augmenter de 1 jusqu'au plus grand numéro de sort_index.Et vous voulez faire cela entièrement en MySQL pour toutes les opérations de déplacement/ajout/suppression? –