2011-11-14 4 views
2

J'ai écrit du code pour mettre à jour certaines lignes d'une table avec une séquence décroissante de nombres. Pour sélectionner les lignes correctes, je dois joindre deux tables. La dernière ligne de la table doit avoir la valeur 0, la seconde dernière -1 et ainsi de suite. Pour y parvenir, j'utilise ORDER BY DESC. Malheureusement, mon code évoque l'erreur suivante:Utilisation incorrecte de UPDATE et ORDER BY

utilisation incorrecte de UPDATE et ORDER BY

Ma lecture suggère que je ne peux pas utiliser UPDATE, JOIN et ORDER BY ensemble. J'ai lu que peut-être des sous-requêtes pourraient aider? Je n'ai vraiment aucune idée de comment changer mon code pour le faire. Peut-être que quelqu'un pourrait poster une version modifiée qui fonctionnera?

while($row = mysql_fetch_array($result)) { 

$products_id = $row['products_id']; 
$products_stock_attributes = $row['products_stock_attributes']; 

mysql_query("SET @i = 0"); 

$result2 = mysql_query("UPDATE orders_products op, orders ord 

        SET op.stock_when_purchased = (@i:=(@i - op.products_quantity)) 
        WHERE op.orders_id = ord.orders_id 
AND op.products_id = '$products_id' 
AND op.products_stock_attributes = '$products_stock_attributes' 
AND op.stock_when_purchased < 0 
AND ord.orders_status = 2 

ORDER BY orders_products_id DESC") 
or die(mysql_error()); 
} 

Répondre

0

Pourquoi avez-vous besoin d'une commande dans une mise à jour. Je pense que vous pouvez simplement le supprimer et vous mettre à jour mettra à jour tout ce qui respecte votre déclaration where.

EDIT: Et vous pourriez peut-être appeler un proc stocké pour simplifier votre code

+1

Si je n'utilise pas ORDER BY, ma séquence de numéros ira dans la mauvaise direction. – nico55555

+0

Un ORDER BY dans une instruction UPDATE peut être utile pour s'assurer que vous n'obtiendrez aucun blocage sur une table de verrouillage de ligne dans un environnement de haute simultanéité – Spredzy

+0

Une commande par peut être utilisée pour modifier une colonne avec une contrainte unique pour assurer vous ne frappez pas les clés en conflit. Par exemple, si vous avez une colonne pour la priorité ou la séquence, il peut être souhaitable de décrémenter tous les numéros de séquence au-dessus d'une certaine valeur. Si vous commandez par cette colonne dans l'ordre croissant, vous pouvez être sûr que vous n'aurez pas de clés en double. – jcbwlkr

0

Vous pouvez utiliser un SELECT appel à boucle à travers les lignes, et inclure vos WHERE et ORDER BY déclarations là-bas, puis au sein de votre boucle while($row = mysql_fetch_assoc($query)){ vous d 'avoir votre déclaration UPDATE table SET key = 'value' WHERE id = '{$row['id']}'.

Bien sûr, cela nécessiterait beaucoup d'exécution de mysql_query(), mais il fonctionnera encore assez rapidement, mais pas à la même vitesse qu'une seule requête.

1

Supprimez simplement votre ORDER BY dans votre instruction UPDATE, puis placez-le dans votre instruction SELECT.

échantillon

:

$query = "SELECT ........ ORDER BY ..." 
$result = mysql_query($query); 

while(....){.... } 
déclaration

UPDATE accepte wont clause ORDER BY.

Questions connexes