Selon la documentation, joins, lorsqu'il est utilisé avec l'instruction update, fonctionne de la même manière que lorsqu'il est utilisé dans les sélections.Problème avec la mise à jour dans MySQL
Par exemple, si nous avons ces deux tableaux:
mysql> SELECT * FROM orders;
+---------+------------+
| orderid | customerid |
+---------+------------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 1 |
+---------+------------+
mysql> SELECT * FROM customers;
+------------+------------+
| customerid | ordercount |
+------------+------------+
| 1 | 9 |
| 2 | 3 |
| 3 | 8 |
| 4 | 5 |
| 5 | 7 |
+------------+------------+
à l'aide des instructions select:
SELECT orders.customerid
FROM orders
JOIN customers ON (customers.customerid = orders.customerid)
retourne:
+------------+
| customerid |
+------------+
| 1 |
| 1 |
| 2 |
| 3 |
+------------+
Alors, je me attendais à la déclaration ci-dessous :
UPDATE orders
JOIN customers ON (customers.customerid = orders.customerid)
SET ordercount = ordercount + 1
pour mettre à jour ordercount pour le client n ° 1 (customerid = 1) pour être 11, mais en réalité ce n'est pas le cas, voici les résultats après la mise à jour:
mysql> SELECT * FROM customers;
+------------+------------+
| customerid | ordercount |
+------------+------------+
| 1 | 10 |
| 2 | 4 |
| 3 | 9 |
| 4 | 5 |
| 5 | 7 |
+------------+------------+
Comme vous pouvez le voir était seulement incrémenté une fois malgré qu'il se produit deux fois dans la table des commandes et malgré que l'instruction select le renvoie correctement.
Est-ce un bug dans MySQL ou est-ce que je fais quelque chose de mal? J'essaie d'éviter d'utiliser le groupe pour des raisons de performance, d'où mon intérêt à comprendre ce qui se passe.
Merci à l'avance
pourrait-il que ce problème montre indirectement une faille dans la conception de votre db? peut-être que c'est trop difficile de garder une commande. Cela peut entraîner des incohérences si vous ajustez ces scores par des mises à jour indépendantes. peut-être qu'il serait préférable de générer ce compte avec une requête, quand vous en avez besoin. – markus
J'ai seulement utilisé l'exemple des clients et des commandes pour démontrer le problème, je ne vais pas l'utiliser de cette façon –