[SQL] mise a jour via 2 tables

mise a jour via 2 tables [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 18-01-2009 à 18:10:23    

Bonjour,  
 
je poste se message pour trouvé une solution a mon problème  
 
je doit modifié la valeur de plusieurs articles d'une de mes tables sous PhpMyAdmin en me servant d'une colonne d'une autre table comme critère de modification  
 
 
mes tables
 
 

Code :
  1. --
  2. -- Structure de la table `series`
  3. --
  4. CREATE TABLE `series` (
  5.   `id_serie` int(10) unsigned NOT NULL auto_increment,
  6.   `nom_serie` varchar(255) NOT NULL default '',
  7.   `type` enum('type1','type2','type3') NOT NULL default 'type1',
  8.   `genre` varchar(70) NOT NULL default '',
  9.   `themes` varchar(255) NOT NULL default '',
  10.   `adulte` enum('OUI','NON') NOT NULL default 'NON',
  11.   `etat` enum('en cours','terminée','inachevée à ce jour','stoppée','') NOT NULL default 'en cours',
  12.   `pays` varchar(50) NOT NULL default '',
  13.   `nbre_total` int(10) unsigned NOT NULL default '0',
  14.   `nbre_parus` int(10) unsigned NOT NULL default '0',
  15.   `auteur` varchar(255) NOT NULL default '',
  16.   `dessinateur` varchar(255) NOT NULL default '',
  17.   `resume` longtext NOT NULL,
  18.   `texte_libre` longtext NOT NULL,
  19.   `editeur` varchar(255) NOT NULL default '',
  20.   PRIMARY KEY  (`id_serie`),
  21.   KEY `adulte` (`adulte`),
  22.   KEY `auteur` (`auteur`),
  23.   KEY `dessinateur` (`dessinateur`),
  24.   KEY `editeur` (`editeur`),
  25.   KEY `etat` (`etat`),
  26.   KEY `genre` (`genre`),
  27.   KEY `id_serie` (`id_serie`),
  28.   KEY `nbre_parus` (`nbre_parus`),
  29.   KEY `nbre_total` (`nbre_total`),
  30.   KEY `nom_serie` (`nom_serie`),
  31.   KEY `pays` (`pays`),
  32.   KEY `themes` (`themes`),
  33.   KEY `type` (`type`)
  34. ) TYPE=MyISAM AUTO_INCREMENT=2191 ;
  35. --
  36. -- Structure de la table `articles`
  37. --
  38. CREATE TABLE `articles` (
  39.   `nom` varchar(255) NOT NULL default '',
  40.   `serie` int(10) unsigned NOT NULL default '0',
  41.   `coffret` enum('OUI','NON') NOT NULL default 'NON',
  42.   `prix` float NOT NULL default '0',
  43.   `date_sortie` date NOT NULL default '0000-00-00',
  44.   `prix_editeur` float unsigned NOT NULL default '0',
  45.   PRIMARY KEY  (`nom`,`serie`),
  46.   KEY `coffret` (`coffret`),
  47.   KEY `date_sortie` (`date_sortie`),
  48.   KEY `nom` (`nom`),
  49.   KEY `prix` (`prix`),
  50.   KEY `prix_editeur` (`prix_editeur`),
  51.   KEY `serie` (`serie`)
  52. ) TYPE=MyISAM;


 
 
 
Mon problème:  
Remplacer le contenu du champ "prix" par "le nouveau_prix" ET le contenu du champ "prix_editeur" par "le nouveau_prix_editeur" pour tous les enregistrements dont le champ "prix" est égal à "telle_valeur" ET le champ "editeur" est égal à "tel_editeur".
 
R:
Problème:  
Remplacer le contenu du champ "5.65" par "5.95" ET le contenu du champ "5.75" par "6.10" pour tous les enregistrements dont le champ "prix" est égal à "5.65" ET le champ "editeur" est égal à "editeur1".  
 
 
Je doit modifié les prix "prix_editeur" "prix" par de nouvelles valeur et se pour différente valeur.  
En gros je devrai le faire pour plusieurs éditeurs qui change leurs gammes prix par tranche [ex: les 5.65 par 5.95; 5.50 par 5.75; 6.92 par 7.25 (sans prendre en conte la modification des "prix_editeur" )] pour faire le lien entre les 2 tables j'ai "serie" et "id_serie"
 
 
Merci pour toute les réponse éventuelle, j'espère que je suis suffisamment claire si un doute subsiste n'hésitez pas me le dire.

Reply

Marsh Posté le 18-01-2009 à 18:10:23   

Reply

Marsh Posté le 19-01-2009 à 11:23:48    

Bonjour.
 
Voir, par exemple, ICI  :ange:  
 
Où est le problème, au juste ? La requête n'a pas l'air trop difficile à concevoir...

Reply

Marsh Posté le 19-01-2009 à 13:12:58    

Merci Macgawel de ta réponse.  
 
La réponse a ma requête me rend se résultat et je ne vois pas comment mi prendre autrement...  
 
requête SQL: Documentation
 
UPDATE articles SET prix = '5.95',
prix_editeur = '6.10' WHERE serie IN (
SELECT s.id_serie
FROM articles a, series s
WHERE a.prix = '5.65'
AND s.editeur = 'editeur1'
AND s.id_serie = a.serie
)
 
MySQL a répondu:Documentation
#1093 - You can't specify target table 'articles' for update in FROM clause

Reply

Marsh Posté le 19-01-2009 à 13:48:55    

A priori (à prendre avec des pincettes, je ne suis pas un pro de MySQL), je dirais que MySQL râle parce que tu essaye de faire un UPDATE sur une table que tu utilises dans ta requête de sélection. En gros, ça crée une boucle...
 
Tu devrais déjà tester ta requête juste en SELECT, histoire de voir.
 
Et, puisqu'on est dans les livres, tu devrais peut-être créer une table avec les gammes de prix.
En fait, tes tables n'ont pas l'air très Relationnelles.
 
J'aurais tendance à faire (en supposant qu'une série reste chez un unique éditeur...) une table supplémentaire :
TARIFS ( (ID_Editeur, ID_Tarif) PK, Prix, Prix_Editeur)
 
Au passage, crée des tables pour tes Types et Etats.
Et revoie un peu les tables (une série peut changer d'éditeur en cours de route...)

Reply

Marsh Posté le 19-01-2009 à 15:49:31    

requête SQL: Documentation
 
SELECT articles
SET prix = '5.95',
prix_editeur = '6.10' WHERE serie IN (
SELECT s.id_serie
FROM articles a, series s
WHERE a.prix = '5.65'
AND s.editeur = 'editeur1'
AND s.id_serie = a.serie
)
 
MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET prix = '5.95',
prix_editeur = '6.10' WHERE serie IN (
SELECT s.id_serie
F' at line 1  
 
voila ce que sa donne...

Reply

Marsh Posté le 19-01-2009 à 15:58:48    

lode a écrit :

requête SQL: Documentation
 
SELECT articles
SET prix = '5.95',

prix_editeur = '6.10' WHERE serie IN (
SELECT s.id_serie
FROM articles a, series s
WHERE a.prix = '5.65'
AND s.editeur = 'editeur1'
AND s.id_serie = a.serie
)
 
MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET prix = '5.95',
prix_editeur = '6.10' WHERE serie IN (
SELECT s.id_serie
F' at line 1  
 
voila ce que sa donne...

Pas étonnant que ça plante !
Syntaxe :

Code :
  1. SELECT Champ1, Champ2, ...
  2. FROM Table
  3. WHERE ( Condition );

Il n'y a JAMAIS de SET dans un SELECT !

Reply

Marsh Posté le 19-01-2009 à 17:05:43    

Code :
  1. MySQL n'a retourné aucun enregistrement. (Traitement en 0.0097 sec.)
  2. requête SQL:
  3. SELECT s.id_serie
  4. FROM articles a, series s
  5. WHERE a.prix = '5.65'
  6. AND s.editeur = 'editeur1'
  7. AND s.id_serie = a.serie
  8. LIMIT 0 , 30


 
merci pour ta correction

Reply

Marsh Posté le 19-01-2009 à 17:25:15    

En règle générale, pour commencer essaye de faire une requête simple, et après tu rajoutes des clauses. Comme ça, tu verras mieux d'où peut venire l'erreur.
 
Le problème vient de la ligne 5 :
Déjà, un nombre ne se met pas entre quotes.
 
Je te dis, fais-toi une table intermédiaire qui contiendra les tarifs. Ca te simplifieras les choses à un point...

Reply

Marsh Posté le 19-01-2009 à 18:02:41    

je ne peut modifié mes tables pour le moment
 
j'ai modifié ma requête et j'obtiens ce résultat:
 

Code :
  1. Affichage des enregistrements 0 - 29 (227 total, Traitement en 0.0011 sec.)
  2. requête SQL:
  3. SELECT s.id_serie
  4. FROM articles a, series s
  5. WHERE a.prix LIKE '5.65'
  6. AND s.editeur = 'editeur1'
  7. AND s.id_serie = a.serie
  8. LIMIT 0 , 30
  9.    
  10.    
  11. Page n°:
  12. Textes complets  id_serie
  13. Modifier  Effacer  4
  14. Modifier  Effacer  4


 
 
Mais a se niveau je n'ai que les id rien qui me permet de modifié ses même id sans les recherche dans la tables articles

Reply

Marsh Posté le 19-01-2009 à 21:36:18    

j'ai testé une variante qui me paressé viable...
 

Code :
  1. CREATE TEMP TABLE series_update AS
  2. SELECT s.id_serie
  3. FROM articles a, series s
  4. WHERE a.prix LIKE '5.65'
  5. AND s.editeur = 'Akata'
  6. AND s.id_serie = a.serie;
  7. UPDATE articles SET prix = '10.65',
  8. prix_editeur = '12.95' WHERE serie IN (SELECT id_serie FROM series_update);
  9. DROP TABLE series_update;


 
résultat
 

Code :
  1. requête SQL: Documentation
  2. CREATE TEMP TABLE series_update AS SELECT s.id_serie
  3. FROM articles a, series s
  4. WHERE a.prix LIKE '5.65'
  5. AND s.editeur = 'Akata'
  6. AND s.id_serie = a.serie;
  7. MySQL a répondu:Documentation
  8. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TEMP TABLE series_update AS
  9. SELECT s.id_serie
  10. FROM articles a, series s
  11. WHERE' at line 1

Reply

Marsh Posté le 19-01-2009 à 21:36:18   

Reply

Marsh Posté le 20-01-2009 à 11:30:52    

Code :
  1. CREATE TEMPORARY TABLE series_update AS
  2. ...


Là, ça passe  :D  
 
Et vu que tu ne peux pas modifier la structure, tu aurais peut-être plus vite fait de faire tes update via un script php (ou via le langage de programmation utilisé, s'il y en a un).

Reply

Marsh Posté le 20-01-2009 à 22:46:33    

Merci macgawel
 
le résultat  :)  
 

Code :
  1. Votre requête SQL a été exécutée avec succès
  2. requête SQL:
  3. CREATE TEMPORARY TABLE series_update AS SELECT s.id_serie
  4. FROM articles a, series s
  5. WHERE a.prix LIKE '5.65'
  6. AND s.editeur = 'editeur1'
  7. AND s.id_serie = a.serie;# Nombre d'enregistrements affectés : 227
  8. UPDATE articles SET prix = '10.65',
  9. prix_editeur = '12.95' WHERE serie IN (
  10. SELECT id_serie
  11. FROM series_update
  12. );# Nombre d'enregistrements affectés : 242
  13. DROP TABLE series_update;# MySQL n'a retourné aucun enregistrement.


 
 
 
pourquoi 227 puis 242 ????

Reply

Marsh Posté le 22-01-2009 à 12:21:49    

j'ai compris le 227 puis 242
 
mais maintenant j'ai un nouveau problème
 

Code :
  1. CREATE TEMPORARY TABLE series_update AS
  2. SELECT s.id_serie
  3. FROM articles a, series s
  4. WHERE a.prix LIKE '5.65'
  5. AND s.editeur = 'editeur1'
  6. AND s.id_serie = a.serie;
  7. UPDATE articles SET prix = '5.94',
  8. prix_editeur = '6.25' WHERE serie IN (SELECT id_serie FROM series_update);
  9. DROP TABLE series_update;


 
réponse
 

Code :
  1. Erreur
  2. requête SQL: Documentation
  3. UPDATE articles SET prix = '5.94',
  4. prix_editeur = '6.25' WHERE serie IN (
  5. SELECT id_serie
  6. FROM series_update
  7. )
  8. MySQL a répondu:Documentation


 
 
je pense que s'est du a la version de phpmyadmin qui se trouve sous 2.6.4-pl4
contrairement a ma base de test qui sous - 2.11.7
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed