2
votes

Réorganiser les éléments dans mysql

J'ai une table MySQL qui a les colonnes suivantes: (id, position, etc.). La position indique un ordre de tri. Comment puis-je réorganiser la position des éléments. Par exemple, si je souhaite réorganiser l'élément de la position 3 à la position 5 ou vice-versa, comment puis-je y parvenir?

Comme demandé, voici quelques exemples de données:

id position name
== ======== =======
3      1     Betty
4      2     Barney
1      3     Fred
2      4     Wilma
5      5     Pebbles

Donc, si je fais une sélection * de la commande client par position , j'obtiens:

id position name
== ======== =======
3      1     Betty
4      2     Barney
2      3     Wilma
5      4     Pebbles
1      5     Fred

Je pourrais alors vouloir déplacer Fred vers le haut liste, disons à la position 3. Je voudrais alors que la liste ressemble à ceci:

id  position name
==  ======== ======
1       5     Fred
2       3     Wilma
3       1     Betty
4       2     Barney
5       4     Pebbles

Ma question est, comment déplacer un élément vers le haut ou vers le bas dans la liste et faire ajuster les positions en conséquence?

Je suppose qu'il serait également important de s'assurer qu'il n'y a pas de numéros de position manquants ou répétés.


8 commentaires

veuillez fournir des exemples de données et votre résultat attendu sous forme de tableau


vous pouvez utiliser la clause order by pour trier la table.


Veuillez expliquer votre problème avec quelques exemples de données. En répondant à votre question, il semble qu'un simple ordre par clause ferait l'affaire


@AniketKariya Ma question n'était pas de trier le tableau, mais de réorganiser les éléments par position. Veuillez consulter ma question de mise à jour pour plus de précisions.


@ fa06 J'ai fourni des exemples de données.


Il n'y a aucune logique perceptible à ce que vous essayez de faire, vous êtes donc obligé de coder en dur.


Il s'agit d'un modèle de réorganisation standard par glisser-déposer, vous trouverez donc des tutoriels qui le couvrent.


@ P.Salmon Pouvez-vous expliquer ce que vous entendez par logique discernable?


3 Réponses :


-1
votes

J'espère que vous attendez cette requête ci-dessous.

select *,case when position = 3 then 5 when position = 5 then 3 else position end as new_position from customer order by new_position


1 commentaires

Je suppose que lorsque quelqu'un monte sur le plateau, tout le monde en dessous descend 1



1
votes

Dans cet exemple UPDATE, pos_from et pos_to doivent être définis.

La position avec pos_from sera remplacée par pos_to.
Et les autres qui doivent être décalés vers le haut ou vers le bas sont corrigés avec +1 ou -1 en conséquence.

Le pos_from peut être supérieur ou inférieur au pos_to.

id | position | name   
-: | -------: | :------
 3 |        1 | Betty  
 4 |        2 | Barney 
 1 |        3 | Fred   
 2 |        4 | Wilma  
 5 |        5 | Pebbles
select * from bedrock order by position;
update bedrock
join
(
  select pos_from, pos_to, 
  case when pos_to > pos_from then pos_from else pos_to end as pos_min,
  case when pos_to > pos_from then pos_to else pos_from end as pos_max,
  case when pos_to > pos_from then -1 else 1 end as pos_delta
  from (
    select 
    5 as pos_from, 
    3 as pos_to
  ) q1
) q2 on position between pos_min and pos_max
set position = case 
               when position = pos_from 
               then pos_to 
               else position + pos_delta 
               end;
id | position | name   
-: | -------: | :------
 3 |        1 | Betty  
 4 |        2 | Barney 
 2 |        3 | Wilma  
 5 |        4 | Pebbles
 1 |        5 | Fred   
select * from bedrock order by position;
insert into  bedrock (position, name) values
(5, 'Fred'),
(3, 'Wilma'),
(1, 'Betty'),
(2, 'Barney'),
(4, 'Pebbles');
create table bedrock (
  id int primary key auto_increment, 
  position int not null, 
  name varchar(30) not null
);

db fiddle ici em>


1 commentaires

C'est génial et il m'a fallu du temps pour tout comprendre. Merci de votre aide!



1
votes

vous pouvez créer une procédure stockée pour mettre à jour la position:

DELIMITER //
CREATE PROCEDURE simpleproc (IN param1 INT, IN param2 INT)
BEGIN
   UPDATE sampleTable SET position = position + 1 WHERE position >= param2;
   UPDATE sampleTable SET position = param2 WHERE id = param1;
END;//
DELIMITER ;

Assurez-vous simplement que cette position n'est pas définie comme clé primaire, je sais que vous la voulez unique; mais cela peut poser des problèmes avec la procédure.

btw, param1 est l'identifiant de l'enregistrement que vous souhaitez mettre à jour et param2 est la position que vous souhaitez définir.

 entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

Cela fonctionne très bien.


1 commentaires

Cela fonctionne-t-il pour monter et descendre dans la liste?