8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,
je voudrais savoir s'il est possible de renuméroter les valeurs d'un colonne.

pour faire simple une table
ID | CATÉGORIE | POSITION
1 | 1 | 1
2 | 2 | 1
3 | 3 | 1
4 | 1 | 2
5 | 1 | 3

je voudrais par exemple, lorsque je supprime l'enregistrement id=4 catégorie=animaux position=2 via une requête DELETE, cela me renumérote les positions de la
catégorie animaux restantes 1,2,...

ID | COLONNE | POSITION
1 | 1 | 1
2 | 2 | 1
3 | 3 | 1
5 | 1 | 2

je ne vois pas comment faire cette requête UPDATE ?
Si quelqu’un pouvait me donner un petit coup de main cela serai cool.

Cdt
Salut,

sauf erreur de ma part tu ne pourras pas le faire en une passe, il faudra d'abord faire l'update en décrémentant de 1 toutes les positions de la catégorie voulue (sauf pour l'id que tu désires supprimer) puis effectuer le delete. Grossièrement, un truc du genre:


UPDATE toto SET position = position - 1 WHERE categorie = <categorie> AND position > 0 AND id != <id que je veux supprimer>;
DELETE FROM toto WHERE id = <id que je veux supprimer>;
Bonjour,
Une fois l'élément supprimé, on peut faire une boucle qui va parcourir la table, triée par ordre croissant des champs à renuméroter, incrémenter un compteur en parallèle, et faire un update pour chaque ligne de la requête :
Quelque chose du genre :
$cptr = 0;
$rows_query = mysql_query("SELECT * FROM matable ORDER BY id ASC");
while($rows = mysql_fetch_array($rows_query))
{
$cptr++;
$id = $rows['id'];
$query = "UPDATE links SET id = '$cptr' WHERE id = '$id'";

}

et les enregistrements seront renumérotés de1 à n.
Je me suis craqué (je viens de me réveiller Smiley langue ) mais en gros ma solution proposée ne pouvait pas marcher, voilà une soluce purement SQL. On va partir de cette structure de données:

Table toto
id (int)
pos (in)

Je n'ai pas pris en compte la catégorie, mais c'est pas plus complexe.
Les données actuelles:

id pos
1 1
2 2
3 3
4 4
5 5

On veut supprimer l'id 3, on fait d'abord le update pour décrémenter toutes les positions supérieurs à celle de l'id 3 qui a pour position 3.


UPDATE toto as t1 INNER JOIN (SELECT * FROM toto WHERE pos > ( SELECT pos FROM toto WHERE id = 3 )) as t2 ON t1.id = t2.id SET t1.pos = t1.pos - 1;


On obtient donc:

id pos
1 1
2 2
3 3
4 3
5 4

Il ne reste plus qu'à supprimer l'id 3


DELETE FROM toto WHERE id = 3;


Tu n'as qu'à adapter pour rajouter la catégorie Smiley smile
j'ai essaye ta requête mais cela me sort 0 ligne affectée,
je du me planté quelque part car en plus j'ai rajouté la categorie

UPDATE footer as t1 INNER JOIN (SELECT * FROM footer WHERE position > ( SELECT position FROM footer WHERE id = 99) AND categorie = 3 ) as t2 ON t1.id = t2.id SET t1.position = t1.position - 1 


je continue mes tests...
Je suppose que ton élément d'id 99 ne fait pas partie de la catégorie 3 ou bien qu'il n'y a pas de position supérieure? Dans mon cas, j'ai rajouté les catégories et ça marche.
si justement mon element fait partie de la categorie 3 il y a des éléments superieurs et inferieur c'est ca le truc
Modifié par spawns (14 Sep 2014 - 18:05)
C'est étrange, essaies les requêtes une à une pour voir si elles te retournent bien le bon contenu.
Tu peux poster le contenu d'un select avec la catégorie en question?
avec le select style :
SELECT * FROM footer WHERE position > ( SELECT position FROM footer WHERE id = 99) AND categorie = 3

il me sort les lignes ayant les positions supérieures

si id=99 position = 2 il sort
id=98 position = 3
id=101 position = 5
id=19 position = 4

mais pas
id=105 position = 1
C'est logique non? Si tu veux supprimer celui en position 2, tu as besoin de modifier tout ceux qui ont une position supérieure, donc 3, 4 et 5, et de les décrémenter. Où alors je n'ai pas bien compris ta demande originale?
Modifié par floreo (14 Sep 2014 - 18:45)
oui ça marche effectivement j'avais des merdas dans ma bdd avec des positions bidons.
donc ta requête est nickel

Merci à toi Floreo