2009-12-29 5 views

Répondre

3

Supposons que la requête envoie la valeur actuelle order et le type d'action (haut/bas) pour la ligne sur laquelle l'utilisateur a cliqué. Pour votre exemple, ce serait quelque chose comme script.php? Oid = 2 & action = up. Ensuite, vous pouvez simplement échanger les valeurs des lignes ayant order = $ oid et order = $ oid-1 pour action = up et les lignes avec order = $ oid et order = $ oid + 1 pour action = "down".

E.g.

UPDATE 
    foo as f1, foo as f2 
SET 
    f1.`order`=1, 
    f2.`order`=2 
WHERE 
    f1.`order`=2 
    AND f2.`order`=1 
+0

Vous ne pouvez pas faire confiance à 'order', n'est-ce pas? – Franz

+0

Si "order" est unique, pourquoi pas? (et pourquoi ne devrait-il pas être unique?) La concurrence serait un autre problème. (edit: mais j'avoue que je n'ai pas essayé/testé, il pourrait très bien y avoir une bien meilleure solution ;-)) – VolkerK

0

Utilisez une liste chaînée: garder parent_id à la place du champ de commande:

id name  parent_id 
1 products 0 
2 gallery 1 
3 contacts 2 

SELECT mo.* 
FROM (
     SELECT @r AS _parent, 
       @r := 
       (
       SELECT id 
       FROM mytable 
       WHERE parent = _parent 
       ) AS _id, 
       @order := @order + 1 AS _order 
     FROM (
       SELECT @order := 0 
       ) vars, 
       mytable 
     ) q 
JOIN  mytable mo 
ON  mo.id = q._id 
ORDER BY 
     _order 

De cette façon, vous pouvez facilement déplacer un élément (ou même un bloc contigu d'éléments) avec au plus 3 mises à jour.

Voir cet article dans mon blog sur la façon de mettre en œuvre et d'interroger ce modèle:

0

Vous avez besoin de plus d'une requête. Quelque chose comme:

SELECT order FROM table WHERE id=X 
UPDATE table SET order=order+1 WHERE order=Y 
UPDATE table SET order=order-1 WHERE id=X 

X est l'ID de l'élément sur lequel vous cliquez sur "haut". Y est le résultat de la première requête SELECT.

+0

Je dois ajouter que vous devez évidemment pas exécuter les requêtes de mise à jour, si le element est le premier ou le dernier élément de la liste déjà ... – Franz

0

id En supposant est une clé primaire ou unique ...

INSERT INTO yourtable (id, order) 
VALUES (1,2), (2,1) 
ON DUPLICATE KEY UPDATE 
order=VALUES(order); 

Si la table est courte paires alors la logique de l'application peut être encore plus simple si vous mettez (id, ordre) dans le VALUES clause pour toutes les lignes de la table - de cette façon, vous n'avez pas besoin de tester pour voir ce qui a changé.

0

Je suppose que le bouton comprend l'identifiant de l'entrée que vous souhaitez déplacer (button_id)

Pour déplacer une entrée dans l'ordre, d'abord passer l'entrée au-dessus de l'entrée actuelle par 1:

UPDATE foo 
SET order = order-1 
WHERE order = ((SELECT order FROM foo WHERE id = "button_id") + 1) 

Ensuite, passez l'entrée en cours jusqu'à 1:

UPDATE foo 
SET order = order+1 
WHERE id = "button_id" 

OU Pour déplacer une entrée dans ord er, premier quart de travail l'entrée sous l'entrée actuelle par 1:

UPDATE foo 
SET order = order+1 
WHERE order = ((SELECT order FROM foo WHERE id = "button_id") - 1) 

ensuite déplacer l'entrée actuelle vers le bas 1:

UPDATE foo 
SET order = order-1 
WHERE id = "button_id" 
Questions connexes