Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
991 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] mise a jour via 2 tables

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] mise a jour via 2 tables

n°1839712
lode
Posté le 18-01-2009 à 18:10:23  profilanswer
 

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.

mood
Publicité
Posté le 18-01-2009 à 18:10:23  profilanswer
 

n°1839885
macgawel
Posté le 19-01-2009 à 11:23:48  profilanswer
 

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

n°1839923
lode
Posté le 19-01-2009 à 13:12:58  profilanswer
 

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

n°1839952
macgawel
Posté le 19-01-2009 à 13:48:55  profilanswer
 

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...)

n°1840048
lode
Posté le 19-01-2009 à 15:49:31  profilanswer
 

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...

n°1840051
macgawel
Posté le 19-01-2009 à 15:58:48  profilanswer
 

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 !

n°1840113
lode
Posté le 19-01-2009 à 17:05:43  profilanswer
 

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

n°1840131
macgawel
Posté le 19-01-2009 à 17:25:15  profilanswer
 

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...

n°1840153
lode
Posté le 19-01-2009 à 18:02:41  profilanswer
 

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

n°1840234
lode
Posté le 19-01-2009 à 21:36:18  profilanswer
 

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

mood
Publicité
Posté le 19-01-2009 à 21:36:18  profilanswer
 

n°1840369
macgawel
Posté le 20-01-2009 à 11:30:52  profilanswer
 

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).

n°1840887
lode
Posté le 20-01-2009 à 22:46:33  profilanswer
 

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 ????

n°1841524
lode
Posté le 22-01-2009 à 12:21:49  profilanswer
 

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
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] mise a jour via 2 tables

 

Sujets relatifs
Requete SQL Hibernatejdbc - Tables Oracle avec $
Requête SQL : comptage des colonnes avec une valeurSQL / PHP Afficher toutes les colonnes d'une table
[ACCESS / Requêtes SQL] Help !Importation des données depuis SQL vers EXCEL
[SGBD/SQL] probleme d'espace oracle8idivision SQL
Inserer de la gestion de donnees via SQL dans du code C[SQL] Mise à Jour de Tables
Plus de sujets relatifs à : [SQL] mise a jour via 2 tables


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR