2009-02-17 6 views
0

Je crée une application Web qui agit comme une liste de priorités, permettant à un utilisateur de réorganiser un ensemble d'éléments dans une liste et de stocker cet arrangement dans une base de données MySQL via un backend PHP.Comment définir dynamiquement une valeur croissante par ligne dans MySQL

Au moment où l'utilisateur a fini d'arranger ses éléments et d'enregistrer la configuration, j'appelle une instruction UPDATE séparée pour chaque ligne, en insérant le priorityLevel (position dans la liste) pour chaque ligne.

Par exemple: (pas mon code de production, mais cela illustre le point)

<?php 
    $items = array(12, 17, 27, 26, 5); // an array of IDs, in proper order 
    // due to nature of foreach loop in PHP, this makes $order be the key value, 
    // in this case, 0, 1, 2, 3, 4 respectively 
    foreach ($items as $order => $item) 
    { 
    $database->query("UPDATE `table` SET `priorityLevel` = {$order} " . 
        "WHERE `ID` = {$item}"); 
    } 
?> 

Cela fonctionne assez bien, mais il semble peu efficace pour exécuter tant de requêtes UPDATE, en particulier lorsque la liste devient longue et nous re-commander de nombreux articles. J'espérais qu'il y avait un moyen de créer de façon dynamique l'ordre dans la commande UPDATE, quelque chose comme ceci:

<?php 
    $database->query("UPDATE `table` SET `priorityLevel` = ORDER_NUMBER " . 
        "WHERE `ID` IN (12, 17, 27, 26, 5)"); 
?> 

... où NUMÉRO_COMMANDE était un nombre dynamique déterminé peut-être par la position de la valeur d'identité dans la clause WHERE . Il devrait également respecter l'ordre des éléments de la clause WHERE et s'assurer que le niveau priorityLevel a été défini en fonction des souhaits de l'utilisateur.

Est-ce que quelqu'un sait si cela est possible dans un environnement MySQL 5/PHP 5? La table utilise le moteur MyISAM pour ne pas prendre en charge les transactions.

(PS - Je sais que certaines des bases de assez bien MySQL, mais je suis loin d'être un expert, donc s'il y a quelque chose en cause ici au-delà de simples CREATE, INSERT, UPDATE, DELETE, s'il vous plaît être descriptif)

(PPS - Ce sujet est difficile pour Google, car les termes sont trop génériques.Si je recherche 'mysql order', je reçois un tas de tutoriels sur la création d'applications Panier pour MySQL!)

+0

Cette question est presque exactement comme celui-ci: http://stackoverflow.com/questions/547534/mysql-based-web-app-easiest-way-for- users-to-choose-order-or-items – ryeguy

+0

Ah, c'est très similaire, merci d'avoir signalé cela. Je n'ai pas trouvé de questions similaires quand je cherchais par moi-même. Cependant, cette question semble plus préoccupé par QUAND pour effectuer la commande, je me demande s'il existe un autre comment enregistrer la commande. –

Répondre

0

Vous devez construire une requête en PHP comme ceci et envoyer cette requête à mysql:

UPDATE `table` 
SET priorityLevel = 
CASE 
WHEN `ID` = 12 THEN 1 
WHEN `ID` = 17 THEN 2 
WHEN `ID` = 27 THEN 3 
WHEN `ID` = 26 THEN 4 
WHEN `ID` = 5 THEN 5 
END 
WHERE `ID` IN (12, 17, 27, 26, 5);

(Testé avec MySql 5.0)

+0

Cela semble assez bon, permet de faire tous les changements dans une requête de balayage. Cela semble encore un peu maladroit quand la liste s'allonge, mais c'est peut-être la meilleure solution pour une seule requête d'incendie. Merci! –

0

Vous pouvez également rendre la boucle plus rapide si vous utilisez une instruction préparée, qui vous permet de modifier les valeurs spécifiques pendant que le serveur MySQL conserve la requête en mémoire. Cela nécessite d'utiliser l'extension MySQLi, au lieu de celle de MySQL.

Quelque chose le long de ces lignes:

$mysql = new mysqli(HOST, USER, PASS, DB); 

$stmt = $mysql->prepare("UPDATE items SET sortorder = ? WHERE id = ?"); 

$stmt->bind_params('ii', $sort, $id); 

foreach ($items as $sort => $id) { 
    $stmt->execute(); 
} 
+0

Merci pour le conseil. J'utilise actuellement une abstraction pour accéder à la base de données, je vais voir si elle utilise mysqli ou pas. –

Questions connexes