[SQL] Requète SQL impliquant 2 tables

Fermé
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009 - 11 janv. 2009 à 22:01
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009 - 15 janv. 2009 à 16:48
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

exemple: je doit modifié un prix d'article [table articles] en fonction de son prix actuelle [table articles] et de son éditeur [table series] en sachant que id_serie [table articles] = serie [table series]

voici ma requête sql actuelle qui ne marche pas
SELECT `prix` , `editeur`
FROM `articles` , `series`
WHERE `id_serie` = `serie`
UPDATE `articles` SET `prix` = '5.65',
`prix_editeur` = '5.50' WHERE `editeur` = 'editeur1' AND `prix` = '6.92' LIMIT 1

si quelqu'un a une idée je suis preneur merci d'avance .
A voir également:

12 réponses

heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
13 janv. 2009 à 00:11
Bonsoir,

Yohan, t'as raison.
J'ai créé des tables d'essai (avec des valeurs selon mon humeur):
# --------------------------------------
DROP TABLE IF EXISTS ccm_ARTICLES;
CREATE TABLE ccm_ARTICLES (
nom varchar(20),
serie integer,
prix decimal(6,2),
prix_editeur decimal(6,2),
primary key(nom)
) type=MyISAM comment='Table des articles';

INSERT INTO ccm_ARTICLES VALUES
('Article 1','1','5.50','6.67'),
('Article 2','5','7.90','8.01'),
('Article 3','9','5.80','6.98'),
('Article 4','7','5.50','6.67'),
('Article 5','3','8.10','8.46'),
('Article 6','1','5.40','6.48'),
('Article 7','4','6.30','6.42');

# --------------------------------------
DROP TABLE IF EXISTS ccm_SERIES;
CREATE TABLE ccm_SERIES (
id_serie integer not null auto_increment,
nom_serie varchar(20),
editeur varchar(25),
primary key(id_serie)
) type=MyISAM comment='Table des séries';

INSERT INTO ccm_SERIES VALUES
('1','Série 1','Plon'),
('2','Série 2','Eyrolles'),
('3','Série 3','O''Reilly'),
('4','Série 4','Apress'),
('5','Série 5','Campuspress'),
('6','Série 8','O''Reilly'),
('7','Série 10','Apress'),
('8','Série 11','Hachette'),
('9','Série 20','Eyrolles');



Puis j'ai essayé la commande suivante qui m'a donné l'erreur ci-dessous:
requête SQL:
UPDATE ccm_ARTICLES SET prix = '9.20', prix_editeur = '10.30'
WHERE ccm_SERIES.id_serie=ccm_ARTICLES.serie AND prix='5.50' AND editeur='Plon' ;

MySQL a répondu:
#1054 - Unknown column 'ccm_SERIES.id_serie' in 'where clause'



La commande suivante fonctionne et change deux enregistrements :
UPDATE ccm_ARTICLES SET prix='9.20', prix_editeur='10.30'
WHERE serie IN (SELECT id_serie FROM ccm_SERIES)
AND prix='5.50';

==> les anciens articles à 5.50 ont été mis à jour quelque soit le nom de l'éditeur, soit 2 enregs.
Ce qui revient à dire qu'on aurait pu taper simplement:
UPDATE ccm_ARTICLES SET prix='9.20', prix_editeur='10.30'
WHERE prix='5.50';
->La clause "serie IN(SELECT...FROM...)" ne semble pas avoir été prise en compte.

J'ai voulu tester en spécifiant un éditeur particulier avec cette commande:
UPDATE ccm_ARTICLES SET prix='9.20', prix_editeur='10.30'
WHERE serie IN (SELECT id_serie FROM ccm_SERIES)
AND 'Plon' IN (SELECT editeur FROM ccm_SERIES)
AND prix='5.50';

Elle ne produit pas d'erreur mais ne change aucun enregistrement (les prix ayant au préalable été remis à 5.50).



En dehors de cela: je n'ai évidemment pas la problématique de la gestion à effectuer et il est difficile à dire si les tables sont adaptées à la gestion mais il me semble qu'avec une bonne analyse, la mise à jour de deux tarifs devrait être beaucoup plus simple :

1. Les données ne doivent pas être redondantes. Si tel est le cas (ex: Eyrolles, O'Reilly), cela doit donner naissance à un objet (objet "Editeurs" avec son identifiant) en relation avec un autre objet
(ex: "[Article]-----(appartenir à)-----[Serie]-----(dépendre d'un)-----[Editeur]")

2. Y a-t-il un lien entre prix et prix_editeur. Si oui (ex: prix HT et prix TTC) et si l'un peut être déduit de l'autre, il ne sert à rien d'enregistrer les deux. Il suffit de faire le calcul ad hoc à partir de la valeur enregistrée. De plus si l'on doit gérer l'historique des tarifs en vue d'une comptabilité, "prix" ne doit pas être une propriété de l'objet "Articles" (car une propriété ne peut prendre qu'une valeur et une seule) mais devrait être une propriété portée par la relation "appartenir à".

3. Règle Merise n° 1. Chaque objet doit avoir un identifiant. L'objet "Articles" donnant naissance à la table ARTICLES a-t-il un identifiant ? Le champ nom serait-il clef primaire ?

4. Règle Merise n° 4. Toutes les propriétés autres que l'identifiant doivent dépendre pleinement et directement de l'identifiant
=> Si "nom" est l'identifiant de la table ARTICLES la propriété "prix" ne dépend pas pleinement QUE du champ "nom" (de l'identifiant). Pour dire ceci je me suis mis en tête que "nom" pouvait être le nom d'un livre (puisqu'on parle d'éditeur) auquel cas le prix d'un même texte publié chez des éditeurs différents n'est pas forcément le même. En revanche un prix donné peut être celui d'un livre donné dans une série donnée chez un éditeur donné. Le prix ne dépend donc pas QUE du "nom" (du titre) mais des trois éléments.

Mais ceci est dit a priori, sans vraiment connaître la problématique. Mais je sais seulement que des tables issues d'une analyse correcte de la gestion à effectuer ne posent quasiment jamais de difficulté pour insérer, modifier ou supprimer des enregistrements. Souvent même, la multiplicité des tables simplifie la gestion, même si cela rallonge parfois un peu l'écriture.

Bon, je vais au lit... :o) Peut-être à plus tard...

helico.
3
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
13 janv. 2009 à 12:36
je pense que sa doit rendre mes tables plus claire

-- 
-- Structure de la table `series`
-- 

CREATE TABLE `series` (
  `id_serie` int(10) unsigned NOT NULL auto_increment,
  `nom_serie` varchar(255) NOT NULL default '',
  `type` enum('type1','type2','type3') NOT NULL default 'type1',
  `genre` varchar(70) NOT NULL default '',
  `themes` varchar(255) NOT NULL default '',
  `adulte` enum('OUI','NON') NOT NULL default 'NON',
  `etat` enum('en cours','terminée','inachevée à ce jour','stoppée','') NOT NULL default 'en cours',
  `pays` varchar(50) NOT NULL default '',
  `nbre_total` int(10) unsigned NOT NULL default '0',
  `nbre_parus` int(10) unsigned NOT NULL default '0',
  `auteur` varchar(255) NOT NULL default '',
  `dessinateur` varchar(255) NOT NULL default '',
  `resume` longtext NOT NULL,
  `texte_libre` longtext NOT NULL,
  `editeur` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id_serie`),
  KEY `adulte` (`adulte`),
  KEY `auteur` (`auteur`),
  KEY `dessinateur` (`dessinateur`),
  KEY `editeur` (`editeur`),
  KEY `etat` (`etat`),
  KEY `genre` (`genre`),
  KEY `id_serie` (`id_serie`),
  KEY `nbre_parus` (`nbre_parus`),
  KEY `nbre_total` (`nbre_total`),
  KEY `nom_serie` (`nom_serie`),
  KEY `pays` (`pays`),
  KEY `themes` (`themes`),
  KEY `type` (`type`)
) TYPE=MyISAM AUTO_INCREMENT=2191 ;


-- 
-- Structure de la table `articles`
-- 

CREATE TABLE `articles` (
  `nom` varchar(255) NOT NULL default '',
  `serie` int(10) unsigned NOT NULL default '0',
  `coffret` enum('OUI','NON') NOT NULL default 'NON',
  `prix` float NOT NULL default '0',
  `date_sortie` date NOT NULL default '0000-00-00',
  `prix_editeur` float unsigned NOT NULL default '0',

  PRIMARY KEY  (`nom`,`serie`),
  KEY `coffret` (`coffret`),
  KEY `date_sortie` (`date_sortie`),
  KEY `nom` (`nom`),
  KEY `prix` (`prix`),
  KEY `prix_editeur` (`prix_editeur`),
  KEY `serie` (`serie`)
) TYPE=MyISAM;
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
13 janv. 2009 à 17:02
tu dois faire ça obligatoirement avec phpMyAdmin ou tu peux faire un script PHP pour tes mises à jour ?
1
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
13 janv. 2009 à 19:46
un script php peut-être utilisé
0
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
12 janv. 2009 à 14:27
j'ai testé

UPDATE `articles` SET `prix` = '5.65', `prix_editeur` = '5.95'
WHERE `id_serie` IN (SELECT `id_serie`
FROM `articles` , `series`
WHERE `prix`='5.65', `editeur`='editeur1'
AND `id_serie` = `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 ' `editeur`=editeur1'
AND `id_serie` = `serie`)' at line 4
-1
doumham Messages postés 116 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 13 mars 2013 1
12 janv. 2009 à 14:35
salut voila la solution

UPDATE articles SET prix = '5.65', prix_editeur = '5.95'
WHERE serie IN (SELECT s.id_serie
FROM articles a, series s
WHERE a.prix='5.65', s.editeur='editeur1'
AND s.id_serie = a.serie);


0
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009 > doumham Messages postés 116 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 13 mars 2013
12 janv. 2009 à 17:03
la réponse

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 ' s.editeur='editeur1'
AND s.id_serie = a.serie)' at line 4
0
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 2 327 > elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
12 janv. 2009 à 17:12
ben oui, ne mets qu'une condition par WHERE. SI tu veux en mettre plusieurs utilise WHERE cond1 AND cond2 AND cond3 AND .....
Mais ça ne sert à rien de préfixer les attributs par la table. Ici tous les attributs ont un nom différent, il ne peut pas y avoir ambiguïté. Ne rien mettre allège la syntaxe.
0
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009 > Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023
12 janv. 2009 à 17:27
En concret la nouvelle commande devrait ressemblé a quoi ?

UPDATE articles SET prix = '5.65', prix_editeur = '5.95'
WHERE serie IN (SELECT s.id_serie
FROM articles a, series s
AND a.prix='5.65', s.editeur='editeur1'
AND s.id_serie = a.serie);

ou

UPDATE `articles` SET `prix` = '5.65', `prix_editeur` = '5.95'
WHERE `id_serie` IN (SELECT `id_serie`
FROM `articles` , `series`
WHERE `prix`='5.65'
AND `editeur`='editeur1'
AND `id_serie` = `serie`);
0
doumham Messages postés 116 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 13 mars 2013 1 > elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
12 janv. 2009 à 17:39
Retester avec ca :

UPDATE articles SET prix = '5.65', prix_editeur = '5.95'
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);
0
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
12 janv. 2009 à 18:20
UPDATE articles SET prix = '5.65',
prix_editeur = '5.95' 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
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
12 janv. 2009 à 18:22
Peux-tu indiquer les 'TABLE.champ' à modifier par quelle valeur précise pour quel critère précis ?
Quelle différence fais-tu entre 'prix' et 'prix_editeur' ? Sont-ce des champs différents dans des tables différentes ? Peux-tu écrire tes schémas de tables comme suit :

ARTICLES(id_article, champ2, champ3, etc...)
SERIES(id_serie, champ2, champ3, etc...)

Je vois des prix différents et on ne sait qui doit remplacer quoi : 5.50 - 5.65 - 6.92 ???

--------------------------------------------------
Je prends l'exemple suivant (relation: ARTICLE appartenir à une SERIE). id_article et id_serie sont clefs primaires dans leurs tables respectives et id_serie dans la table ARTICLES est une clef étrangère traduisant la migration d'une relation u-naire (0,1 ou 1,1) :

MCD:
[ARTICLES]--1,1-----(appartenir)-----1,n--[SERIES]

Schemas:
ARTICLES(id_article, prix, champ3, etc..., id_serie)
SERIES(id_serie, editeur, champ3, etc...)

remplacer les prix d'une série donnée actuellement à 5.50 (dans ARTICLES) par 5.65 :

UPDATE ARTICLES SET prix='5.65'
FROM ARTICLES,SERIES
WHERE prix='5.50'
AND SERIES.id_serie=ARTICLES.id_serie
AND SERIES.id_serie='xxxx';

NB: Il faut en effet désigner la série au cas où tu aies plusieurs séries différentes au même prix (5.50).

Mais ce remplacement ne correspond peut-être pas à ce que tu veux faire ; d'où intérêt à définir avec exactitude tes tables et ce que tu veux faire.

helico.
-1
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
12 janv. 2009 à 19:02
Peux-tu indiquer les 'TABLE.champ' à modifier par quelle valeur précise pour quel critère précis ?
Quelle différence fais-tu entre 'prix' et 'prix_editeur' ? Sont-ce des champs différents dans des tables différentes ? Peux-tu écrire tes schémas de tables comme suit :

ARTICLES(id_article, champ2, champ3, etc...)
SERIES(id_serie, champ2, champ3, etc...)

R:
ARTICLES(nom, serie, prix, prix_editeur...)
SERIES(id_serie, nom_serie, editeur...)


Je vois des prix différents et on ne sait qui doit remplacer quoi : 5.50 - 5.65 - 6.92 ???

R:
On remplace [prix] et [prix_editeur] en utilisant le [prix] actuelle et l'[editeur] pour savoir les quelles modifié


--------------------------------------------------
Je prends l'exemple suivant (relation: ARTICLE appartenir à une SERIE). id_article et id_serie sont clefs primaires dans leurs tables respectives et id_serie dans la table ARTICLES est une clef étrangère traduisant la migration d'une relation u-naire (0,1 ou 1,1) :

R:
[serie] int(10) UNSIGNED
[id_serie] int(10) UNSIGNED Non auto_increment

les donnée identique dans les deux tables sont [serie] et [id_serie] ces 2 champ me permette de savoir quelle [ARTICLES (nom)] appartient a tel [SERIES(nom_serie, editeur)]



Mon but et de modifié toutes les series d'[ARTICLES(prix, prix_editeur)] en fonction de le [prix] et de leur [editeur] quelle que sois leur [serie] ou [id_serie].
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
12 janv. 2009 à 20:12
UPDATE ARTICLES SET prix = 'nouveau_prix', prix_editeur = 'nouveau_prix_editeur'
WHERE ARTICLES.serie = SERIES.id_serie
AND prix = 'ancien_prix'
AND editeur = 'valeur_editeur';

Avec cette commande:
- pour tous les cas où ARTICLES.serie = SERIES.id_serie
- ET pour toutes les valeurs de "ARTICLES.prix" égales à 'ancien_prix'
- ET pour tous les cas où SERIES.editeur est égal à la 'valeur-editeur'

on remplace ARTICLES.prix par 'nouveau_prix' ainsi que ARTICLES.prix_editeur par 'nouveau_prix_editeur'

Je n'ai pas trop de conseils à donner (l'expérience n'éclairant que le chemin de celui qui l'a parcouru) mais... :

- Y a-t-il une clef primaire dans la table ARTICLES ? (ex: id_articles)
- Dans le cas où il y a clef primaire il n'est jamais obligatoire mais souvent préférable de déclarer clef primaire un champ de type entier non signé et généralement auto_increment
- Il est aussi chaque fois que possible préférable de donner les mêmes noms de champs à ceux qui contiennent les mêmes données (ex: ARTICLES.id_serie et SERIES.id_serie, on différencie alors ces champs en écrivant selon le modèle 'TABLE.champ')
- De mettre comme premier champ le champ clef primaire (quoique ce ne soit pas obligatoire, c'est juste pour une question de lisibilité)
- De mettre (là encore ce n'est pas obligatoire) en dernière position de champ les clefs étrangères, càd les champs qui sont clef primaire dans une autre table. ex: ARTICLES(id_article, prix, prix_editeur, id_serie) et qui sont le plus souvent indexés.

Pour éviter de 'polluer' le forum par une conversation qui approfondirait ta question, tu peux écrire à webmaster@fr-webdev.net

helico.
-1
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
12 janv. 2009 à 21:48
UPDATE articles SET prix = '9.00',
prix_editeur = '10.00' WHERE articles.serie = series.id_serie AND prix = '5.65' AND editeur = 'editeur1'

MySQL a répondu:Documentation
#1054 - Unknown column 'series.id_serie' in 'where clause'

les clef primaire dans la table ARTICLES [nom, serie]
les clef primaire dans la table SERIES [id_serie ]

merci de tes renseigement
0
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 2 327
12 janv. 2009 à 20:32
Arg, cette erreur-là : #1093 - You can't specify target table 'articles' for update in FROM clause semble être spécifique à MySQL qui n'est pas capable de faire un update sur une table qu'il doit utiliser dans la condition. Voilà ce qu'en dit la doc officielle : Currently, you cannot update a table and select from the same table in a subquery.

Je ne pense pas que ce soit faux en soi. Il faudrait essayer avec un autre SGBD.

heliconius : ton truc ne marchera pas car SERIES.id_serie n'appartient pas à la table ARTICLES, il faut faire ue jointure.

Au pire tu créés une table temporaire dans laquelle tu sélectionnes tous les id_articles qu'il va falloir updater, tu fais l'update dans une autre requête. Ceci marchera à coup sûr.
CREATE TEMP TABLE series_update AS
SELECT id_serie
FROM articles, series
WHERE prix = '5.65'
AND editeur = 'editeur1'
AND id_serie = serie;

UPDATE articles SET prix = '5.65',
prix_editeur = '5.95' WHERE serie IN (SELECT id_serie FROM series_update);

DROP TABLE series_update;
 


Pour éviter de 'polluer' le forum par une conversation qui approfondirait ta question, tu peux écrire à webmaster@fr-webdev.net
euh, non, le forum est là pour ça. Ce n'est pas l'aide privée qui le fait "vivre".
-1
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
12 janv. 2009 à 20:45
Salut Yoan !

Effectivement, la commande était destinée à MySQL. Ceci car je ne pense pas que beaucoup de personnes ou d'hébergeurs utilisent Oracle ! Ceci dit, la commande me paraît être du SQL standard.

Par ailleurs tu dis "#1093 - You can't specify target table 'articles' for update in FROM clause". La commande proposée n'utilisait pas la clause FROM :

UPDATE ARTICLES SET prix = 'nouveau_prix', prix_editeur = 'nouveau_prix_editeur'
WHERE ARTICLES.serie = SERIES.id_serie
AND prix = 'ancien_prix'
AND editeur = 'valeur_editeur';

SERIES.id_serie n'appartient effectivement pas à la table ARTICLES puisque "SERIES.id_serie" signifie "le champ id_serie de la table SERIES"

helico.
-1
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 2 327
12 janv. 2009 à 20:50
Non, l'erreur "#1093" c'est pour la requête imbriquée qui ne marche pas.

Mais dans ce que tu proposes, c'est un autre pb : MySQL va chercher un champ nommé "SERIES.id_serie", et j'en mettrais [presque] ma main à couper qu'il va te refiler un "unknown column". Tu es obligé de sélectionner la table avant de pouvoir l'utiliser, ça me semble normal ; et dans cette requête elle n'est sélectionnée nulle part.
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
13 janv. 2009 à 14:13
Salut elpah.

Merci. C'est effectivement un peu plus clair et il me semble (IMHO) que ta base pourrait être optimisée par la création de nouvelles tables pour en faciliter la gestion et éviter des erreurs.

J'imagine que "series.themes" pourrait contenir "Science Fiction". Il ne faut pas en faire un champ varchar(255) dans lequel tu écrirais en toutes lettres "Science Fiction" et ce pour plusieurs raisons:
a) tu perds de la place pour rien. Inutile d'écrire 50 fois "Science Fiction" en toutes lettres. C'est plus court d'écrire que le numéro du thème est 5
b) Si un jour par erreur tu saisis "Sciences Fiction" (avec un 's') et que tu recherche le thème "Science Fiction" (sans 's') ou le contraire, il t'en manquera 1
c) Si tu as envie de changer le nom du thème pour un autre plus approprié, il te suffira de changer le libellé et de ne pas toucher au numéro (identifiant)

Ton modèle devient :
[SERIES]--1,1---(appartenir à un)---0,n--[THEMES]

et tes schemas deviennent:
SERIES (idser, ...autres champs..., idth)
THEMES (idth, libellé)

Même chose pour les mêmes raisons en ce qui concerne les champs
serie.genre
serie.pays
serie.auteur
serie.dessinateur
serie.editeur
serie.etat
NB: en général on ne met en type "enum" que les données ayant un nombre défini et arrêté de cas or ici, on pourrait peut-être trouver par la suite "rééditée".

De plus un MCD doit être une représentation du réel. Dans la réalité, un auteur et un dessinateur ne sont ni plus ni moins que des personnes et rien n'empêche d'un dessinateur devienne auteur ou soit les deux.

Ton modèle devient (si tu ne prends en compte que les séries écrites par une personne seulement et dessinées par une personne seulement au lieu d'envigager une co-écriture et co-illustration):

[SERIES]--1,1---(ecrite par)---0,n--[PERSONNES]
[SERIES]--0,1---(illustrée par)---0,n--[PERSONNES]

et tes schemas deviennent:
SERIES (idser, ...autres champs..., idgenre, idetat, idpays, idth, idp_aut, idp_des)
GENRES (idgenre, libellé)
ETATS (idetat, etat)
PAYS (idpays, pays)
THEMES (idth, libellé)
PERSONNES (idp, nom, prenom)

Voir si l'éditeur ne peut pas être enregistré dans la table PERSONNES et avoir une relation telle que :
[SERIES]--1,1---(edité par)---0,n--[PERSONNES]

j'aurais besoin d'autres informations pour pouvoir aider à la modélisation.
Si j'ai bien cru comprendre tu te fais une application de gestion de documents rédigés, illustrés et édités (des BDs ?)
Peux-tu me dire quelle est la signification que tu donnes aux mots :
- articles (article de journal ? un article dans le sens un objet de vente ?)
- série (série d'articles ? d'une collection d'édition ? ex: la série "Le masque" dans les polars)
- type (dans la table série)
- coffret (dans la table article)

Une série est-elle composée de plusieurs éléments ?
Si oui, chaque élément de la série porte-t-il un nom distinct ?
Pays (dans la table "séries") est-il le pays de lequel la série a été éditée, le pays de l'auteur ou du dessinateur ?

helico.
-1
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
13 janv. 2009 à 16:19
Salut helico.


Il m'a était demandai de modifié les prix de la tables article via son [prix] actuelle et son [editeur]
et comme un site doit tournai dessus (site en local) je ne peut pas modifié la structure des tables même si cela me démange parfois.

Tu pense qu'il est possible vu la structure des tables de modifié les prix d'un coup via une requête Sql ?
0
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 2 327 > elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
13 janv. 2009 à 21:42
C'est vraiment génant à ce point-là que ça doive se faire en plusieurs requêtes ?

Tout le temps réduire les opérations compliquées à une unique requête ça doit demander de grosses réserves d'aspirines, ça :-) Quand c'est possible ....
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
13 janv. 2009 à 23:52
"Il m'a été démandé de..." laisse supposer que tu opères dans un cadre professionnel.

J'ai du mal à croire qu'en milieu professionnel (avec les enjeux commerciaux que l'on devine auprès des clients) un site puisse tourner sur des tables ainsi conçues. De plus, que veux-tu dire par site "en local" ? Non accessible aux autres machines ? Si c'est le cas, ce n'est pas un site, alors ! Quoiqu'il en soit, et à la limite, que les tables soient bien construites ou pas, cela ne me regarde pas et je ne devrais, pour t'aider, que me cantonner à ta demande (sauf si la conception gène sérieusement ou empêche la mise à jour demandée).

Je veux bien t'aider ou faire ce que je peux pour ça, car j'ai tout mon temps : je suis à la retraite. Mais à condition que je comprenne ce qu'il faut faire et dans quel contexte car j'ai un grave défaut : je n'arrive à rien si je n'ai pas compris de quoi il s'agit. Et je ne comprends pas ce que signifie "modifer quelque chose 'via' autre chose". En plus, il y a trois prix (5.50 - 5.65 - 6.92) mais il ne faut en changer que deux et je ne sais pas ce que tu veux dire par [prix] actuel. S'agit-il du prix qui est actuellement enregistré dans la base de données ou du prix actuel (prix actualisé: le nouveau prix à utiliser qui viendra remplacer l'ancien) ?

A la limite, je peux comprendre un discours tel que :

Soient deux tables:

SERIES (id_serie, editeur, ...)
=> clef primaire (id_serie)

ARTICLES (nom, serie, prix, prix_editeur, ...)
=> clef primaire (nom,serie)
=> clef etrangère (serie) pour laquelle ARTICLES.serie = SERIES.id_serie

Problème:
Remplacer le contenu du champ "prix" par "nouveau_prix" ET le contenu du champ "prix_editeur" par "nouveau_prix_editeur" pour tous les enregistrements dont le champ "prix" est égal à "telle_valeur" ET le champ "editeur" est égal à "tel_editeur".

Si tel est exactement l'objectif à atteindre, confirme-le ; dans le cas contraire précise le problème sans qu'il y ait la moindre ambiguïté sinon je serai désolé de te dire de t'en remettre à quelqu'un d'autre. J'ai noté qu'éventuellement, tu peux faire un script PHP...

A bientôt.

helico.
-1
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
14 janv. 2009 à 11:08
Merci de ta réponse helioc.

je me permet de prendre un bout de ta réponse pour êtres le plus claire possible


Problème: 
Remplacer le contenu du champ "prix" par "nouveau_prix" ET le contenu du champ "prix_editeur" par "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")]


Merci de tes réponse, j'espère que je suis suffisamment claire si un doute subsiste n'hésite pas me le dire.
0
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
15 janv. 2009 à 16:48
j'ai remarquai que pour modifié les prix de la table articles sans trié via les editeure de la table series sa donne

UPDATE `articles` SET `prix` = '5.75',
`prix_editeur` = '5.95' WHERE CONVERT( `articles`.`prix` USING utf8 ) = '5.65';


mais comment mètre la sélection par editeur la dessus ?
-1
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 2 327
11 janv. 2009 à 23:10
Tu peux faire des requêtes imbriquées :
UPDATE `articles` SET `prix` = '5.65', `prix_editeur` = '5.50'
WHERE `id_serie` IN (SELECT `id_serie`
				FROM `articles` , `series`
				WHERE `id_serie` = `serie`);

Mais ça serait sympa que tu nous donnes le schéma relationnel en entier, ce serait plus facile de voir ce qu'on fait ;-)
-2
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
11 janv. 2009 à 23:57
Merci pour ta reponce

Mon schéma de table

[table articles] [table series]
nom
serie <-identique-> id_serie
prix [5.50] nom_serie
prix_editeur [ 5.80] editeur [editeur1]


le but et de modifié les prix de 5.50 d'un editeur en 5.65 et le prix_editeur de 5.80 a 5.95

si tu as d'autre question sur mes tables n'hésite pas.
0
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 2 327 > elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009
12 janv. 2009 à 00:10
OK, j'avais zappé la sélection. Ceci devrait donner un résultat concluant ^^
UPDATE `articles` SET `prix` = '5.65', `prix_editeur` = '5.50'
WHERE `id_serie` IN (SELECT `id_serie`
				FROM `articles` , `series`
				WHERE `prix`='6.92'
				AND `id_serie` = `serie`);
0
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009 > Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023
12 janv. 2009 à 10:15
Mon critère de sélection étant [editeur] et [prix] (l'editeur1 dont le prix et de 5.50 dois changer en 5.60... je précise qu'il y d'autres éditeurs qui pratique le prix de 5.50) je pense que [editeur] manque dans ta requête.

Merci pour ta réponse si rapide.
0
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 2 327 > Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023
12 janv. 2009 à 10:28
SI je résume la requête en français, tu veux changer le prix et le prix_editeur pour tous les articles qui proviennent de l'éditeur editeur1 dont le prix est actuellement de 5.50, c'est ça ?

Si oui, il y a juste à ajouter une sélection :
UPDATE `articles` SET `prix` = '5.65', `prix_editeur` = '5.50'
WHERE `id_serie` IN (SELECT `id_serie`
				FROM `articles` , `series`
				WHERE `prix`='6.92'
				AND `editeur` = `editeur1`
				AND `id_serie` = `serie`);
Si non, explique en français ce que tu veux faire.
0
elpah Messages postés 23 Date d'inscription vendredi 9 mai 2008 Statut Membre Dernière intervention 15 janvier 2009 > Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023
12 janv. 2009 à 21:53
Tu as bien saisi ce que je veux faire.

UPDATE `articles` SET `prix` = '10.00',
`prix_editeur` = '15.50' WHERE `id_serie` IN (
SELECT `id_serie`
FROM `articles` , `series`
WHERE `prix` = '5.65'
AND `editeur` = `editeur1`
AND `id_serie` = `serie`
)

MySQL a répondu:Documentation
#1054 - Unknown column 'editeur1' in 'where clause'
0