Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/11/2009, à 12:46

Jerubuntu

(résolu) [MySQL] Requête SELECT dans le WHERE d'un UPDATE

Bonjour les gens,

C'est c*n, mais je retrouve pas la syntaxe efficace pour effectuer un truc tout simple...

Voila, dans ma base de donnée de gestion de livres, j'ai (entre autres) trois tables :
- une table `livres` : avec un `id` (clé), un `prix`, et pleins d'autres infos (titre, etc.)
- une table `propriétaires` : avec un `id` (clé), un libellé, etc.
- une table intermédiaire `est_proprietaires` qui joint les deux `id` (un livre pouvant avoir, dans notre système, plusieurs proprietaires...) (that is the reason why...)

Pour des raisons internes, nous aimerions baisser les prix de certains livres, suivant leur propriétaire...
J'ai donc récupéré les `id` des proprietaires dont je veux modifier les prix de livres.

Pour selectionner les livres en question (et voir leur prix), je fais un :

SELECT `livres`.`id`, `livres`.`prix` FROM `livres`, `est_proprietaires` WHERE 1 AND `livres`.`id`=`est_proprietaires`.`id` AND `livres`.`ref` LIKE "%BJ" AND `est_proprietaires`.`proprietaires_id`="3"

Et ça fonctionne impec' !

Par contre, quand je passe au UPDATE, ça marche plus... Je fais :

UPDATE `livres` SET `livres`.`prix` = `livres`.`prix` * 0.80 WHERE `livres`.`id` = ( SELECT `livres`.`id` FROM `livres`, `est_proprietaires` WHERE 1 AND `livres`.`id`=`est_proprietaires`.`id` AND `livres`.`ref` LIKE "%BJ" AND `est_proprietaires`.`proprietaires_id`="3" )

Et là, il me dit #1093 : You can't specify target table 'livres' for update in FROM clause
En gros, je ne peux pas appeler dans la clause FROM de la sous-requête la même table que celle que j'UPDATE...

Mais du coup, ben... je fais comment ??? J'ai cherché dans deux trois sources connuées ou non de moi (via google...), mais rien...

Merci d'avance aux pros du SQL (et désolé pour une question si basique)

J.

Dernière modification par Jerubuntu (Le 24/11/2009, à 16:34)

Hors ligne

#2 Le 24/11/2009, à 12:55

Totor

Re : (résolu) [MySQL] Requête SELECT dans le WHERE d'un UPDATE

je ne connais pas mysql mais sous oracle, ce serait plutôt ainsi :

UPDATE `livres` SET `livres`.`prix` = `livres`.`prix` * 0.80 WHERE `livres`.`id` in ( SELECT `livres`.`id` FROM `livres`, `est_proprietaires` WHERE 1 AND `livres`.`id`=`est_proprietaires`.`id` AND `livres`.`ref` LIKE "%BJ" AND `est_proprietaires`.`proprietaires_id`="3" )


-- Lucid Lynx --

Hors ligne

#3 Le 24/11/2009, à 12:58

k-o-x

Re : (résolu) [MySQL] Requête SELECT dans le WHERE d'un UPDATE

Jerubuntu a écrit :

Et là, il me dit #1093 : You can't specify target table 'livres' for update in FROM clause
En gros, je ne peux pas appeler dans la clause FROM de la sous-requête la même table que celle que j'UPDATE...

C'est exactement ça. C'est une restriction de MySQL. C'est valable pour UPDATE et DELETE.
Pour t'en sortir, tu dois faire ta sous requête d'abord, puis ton update avec le résultat de ta sous requête.

Hors ligne

#4 Le 24/11/2009, à 14:37

roynux

Re : (résolu) [MySQL] Requête SELECT dans le WHERE d'un UPDATE

Bonjour,

La doc, ça aide toujours. wink
http://dev.mysql.com/doc/refman/5.0/fr/update.html

update 
	livres, 
	est_proprietaires 
set 
	livres.prix = livres.prix * 0.80
where
	livres.id = est_proprietaires.id
	and livres.ref like '%BJ'
	and est_proprietaires.proprietaires_id = 3

Ca devrait faire l'affaire.

PS: Il ne faut pas mettre de ' et de " atour des noms de tables et de champs, ça rend le code plus difficile à lire.

Hors ligne

#5 Le 24/11/2009, à 16:34

Jerubuntu

Re : (résolu) [MySQL] Requête SELECT dans le WHERE d'un UPDATE

Merci les gens, je savais que je pouvais compter sur vous ;-)

Hors ligne