Aller au contenu

Update ou Insert ou...


Guest meeeuuuhhh

Sujets conseillés

Guest meeeuuuhhh

Bonjour à tous,

Je débute avec mysql et vu que je me prend la tête avec une requête, je me suis dit que l'aide de quelques webmasters expérimentés serait la bienvenu. Comme l'on m'a parlé de ce forum, je m'y suis inscrit et voilà :)

La situation est la suivante :- J'ai une table 'domaines' et une table 'annuaire'.

- Dans la table 'domaines' j'ai un champ `site`.

- Dans la table 'annuaire' j'ai aussi un champ `site` en commun avec celui de la table 'domaines' mais dans cette table, le champs `site` peut avoir la même valeur pour plusieurs tuples.

- Chaque tuple de la table 'domaines' a un id.

- La table 'annuaire' possède un champ 'idSite'.

Ma question est la suivante:

Je souhaite que chaque tuple de la table 'annuaire' voit la valeur du champs 'idSite' prendre la valeur de l'id du tuple de la table 'domaines' dont le champ 'site' à la même valeur.

Comme un exemple vaut mieux qu'un long discours :

- Dans la table 'domaines' j'ai le tuple :

id = 65

site = google

- Dans la table 'annuaire' j'ai 7 tuples dont le champ site=google.

Je voudrais donc que ces 7 tuples prennent la valeur 65 pour le champs idSite.

Si vous avez la solution, je vous serais reconnaissant de bien vouloir me l'indiquer parce que je suis sur ce problème depuis 12h00 et je craque un peu.

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Salut,

La solution consiste à faire une requète du genre :

UPDATE annuaire SET idsite=65 WHERE site='google'

Par contre, il faut que tu prenne garde à la construction de ta base de données, notamment au niveau de la redondance d'informations. A quoi te sert-il d'avoir le nom du site dans les deux tables ?

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Merci NorSeb pour ta réponse

Ceci dit la réponse est un peu trop simple.

Dans l'exemple je cite le cas d'un tuple ayant la valeur 65.

Mais j'ai 300 tuples dans la table domaines et 700 dans la table site.

Je voudrais donc que tous les tuples de la table sites prennent la valeur de l'id du tuple de la table domaines ayant la clef étrangère 'site' en commun, comme expliqué ci-dessus (il n'y a que le "tous les tuples" que je n'avais pas précisé).

Pour la redondance de l'informations, tu fais bien de me le rappeler mais là ce n'est pas mon souci premier vu que je débute et maîtrise mal mysql, c'est plus simple pour moi de multiplier les tables.

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Une autre solution consiste à attribuer un idSite différent pour chaque enregistrement de la table annuaire ayant la même valeur dans le champ site.

exemple:

J'ai 3 tuples dans la table annuaire avec comme valeur du champ site 'bob' , 'marcel' et 'jack. Chacun de ces enregistrement prend un idSite différent (mettons 4, 5 et 6

Par contre, toujours dans la table annuaire j'ai 5 enregistrement dont la valeur du champ site est 'éric'. Ces 5 enregistrement prennent comme idSite la valeur 7).

Cela évite deux tables c'est un fait, mais pour la requête, je n'y arrive pas.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Bien au contraire, si tu débutes, cela doit devenir ton soucis premier de faire les choses correctement dès le départ :)

Il est toujours plus difficile ensuite de perdre les mauvaises habitudes.

Pour ton problème, tu dois "éclaicir" ta base :

1 Table domaine avec un champ id et un champ nom

1 Table annuaire avec un champ id et un champ nom

1 Table domaine_annuaire avec le champ id de la table domaine et le champ id de la table annuaire.

Ainsi, pas de redondance d'informations.

Pour y parvenir, tu dois faire un script en php avec une requete SQL.

Portekoi

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Bonjour Portekoi,

Tu as raison pour ce qui est des bonnes habitudes.

Par contre il me semble que dans ton exemple tu rajoutes encore une table.

Le mieux serait que je trouve la requête pour réussir ce que j'explique dans le message qui précède le tiens.

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Re,

Oui, j'ai rajouté une table qui t'évite d'avoir à en modifier 2 :)

Pour la requête, c'est celle de NorSeb à savoir :

UPDATE annuaire SET idsite=65 WHERE site='google'

Le but étant de la mettre dans une boucle PHP.

Portekoi

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Est-tu certains de la réponse d'avoir pris en compte la réponse que j'ai faite à NorSeb, Portekoi?

Parce qu'avec cette requête, je ne peux pas mettre à jour tous les champs de la table annuaire d'un coup en donnant la même valeur au champ idsite pour tous les tuples qui ont la valeur site en commun.

C'était juste un exemple le tuple google.

**edit** c'est juste une requête sql à placer dans le phpmyadmin que je voudrais

Modifié par meeeuuuhhh
Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Merci Portekoi pour ta sollicitude :D

J'ai une dizaine de bouquins sur phpmysql, alors phpdebutant, ça ne me motive pas.

Je pense qu'il doit bien y avoir une requête qui permette d'attribuer un id commun à tous les tuples d'une table ayant un champ en commun.

C'est ça que je voudrais et que je recherche.

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Bon et bien tant pis

J'ai dit que je suis débutant, ça ne veut pas dire que je ne sais pas faire un

" UPDATE annuaire SET idsite=65 WHERE site='google' "

Je demandais juste un peu d'aide pour une requête plus complexe, pas un cours sur PHP ni un relookage de ma base de donnée.

Mais je vous remercie quand même de m'avoir répondu.

Lien vers le commentaire
Partager sur d’autres sites

Je reprend le train en marche... :wacko:

Ceci dit la réponse est un peu trop simple.

Dans l'exemple je cite le cas d'un tuple ayant la valeur 65.

Mais j'ai 300 tuples dans la table domaines et 700 dans la table site.

Je voudrais donc que tous les tuples de la table sites prennent la valeur de l'id du tuple de la table domaines ayant la clef étrangère 'site' en commun, comme expliqué ci-dessus (il n'y a que le "tous les tuples" que je n'avais pas précisé).

A priori tu ne peut pas faire ca en une seule requète... Du moins pas avec mysql ;)

D'où la réponse de Portekoi : un script php qui fait un recence les sites de la table "domaines" puis qui modifie les enregistrements correspondant de la table "annuaire".

Pour la redondance de l'informations, tu fais bien de me le rappeler mais là ce n'est pas mon souci premier vu que je débute et maîtrise mal mysql, c'est plus simple pour moi de multiplier les tables.

Pour avoir fait une école d'informatique je peux t'affirmer que ca devrais être ta premiere priorité !

En effet, la premiere chose que l'on apprend est d'apporter la plus grande importance à la préparation du projet (l'analyse) plutôt qu'au projet lui même. Ceci pour la simple et bonne raison qu'une erreur d'analyse est plus facile à corriger au départ, qu'en cours de développement (comme tu peux d'ailleurs t'en rendre compte).

La différence de "cout" (en temps ou en argent comme tu veux) est de l'ordre de 1 pour 1000.

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Merci NorSeb d'avoir repris le train en marche.

Nonobstant l'analyse du projet, je vais reposer ma question d'une manière beaucoup plus simple, parce que je serais très étonné qu'il n'y ait pas une requête sql permettant de faire cette chose ci :

J'ai donc ma table 'annuaire' (la table 'domaine' a pris feu elle n'existe plus).

Dans cette table j'ai 500 tuples.

Plusieurs tuples ont la même valeur pour le champs 'site'.

Je voudrais que tous les tuples ayant la même valeur pour le champs 'site' prennent la même valeur pour le champs idSite ou une valeur unique s'ils n'y a pas d'autre tuples à avoir une valeur similaire à la leur pour le champs 'site'.

Autremement dit "comment attribuer un même id à plusieurs tuples d'une même table ayant la même valeur pour un champ donné"?

C'est forcément possible un truc comme ça, j'avais dû mal poser la question.

Modifié par meeeuuuhhh
Lien vers le commentaire
Partager sur d’autres sites

Autremement dit "comment attribuer un même id à plusieurs tuples d'une même table ayant la même valeur pour un champ donné"?

Autrement dit, je vois pas.

Tu es obligé de grouper les enregistrements (ou tuples) ayant la même valeur pour le champ "site", puis pour chaque groupe, d'attribuer une valeur au champ "idsite". Or, cette derniere action nécessite une requete (UPDATE) par valeur de "idsite".

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Je n'ai rien contre les requêtes UPDATE personnellement hein...

Je suis en train d'effectuer les recherches mais bon ça doit quand même pas être sorcier !

Lien vers le commentaire
Partager sur d’autres sites

e suis en train d'effectuer les recherches mais bon ça doit quand même pas être sorcier !

Ben si justement :D

Il faut faire autant d'Update par groupe... donc c'est impossible en une seule requète.

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Sinon pour mon histoire de recopiage de champs entre deux tables ayant un champ en commun,j 'essaie ça en ce moment :

UPDATE domaines, sites SET domaines.idSite= sites.id WHERE domaines.site = sites.site

et j'obtiens' #1064 - You have an error in your SQL syntax near '

sites SET domaines.idSite = sites.site WHERE domaines.site = sites.site' at line 1'

Modifié par meeeuuuhhh
Lien vers le commentaire
Partager sur d’autres sites

Oui c'est normal, tu ne dois pas pouvoir faire un update sur deux tables...

[edit]Tiens... non, tu peux. Au temps pour moi[/edit]

Modifié par NorSeb
Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

Non mais je veux faire un update que dans le champ idSite de la table domaines.

J'obtiens la même erreur en faisant

UPDATE domaines SET...

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

oui j'ai bien vérifié, peut-être est-ce un problème de quotes.

J'écris la requête dans le champ sql de phpMyadmin.

Lien vers le commentaire
Partager sur d’autres sites

Guest meeeuuuhhh

je viens d'essayer celle-ci

UPDATE  `domaines` ,
SET  domaines.idSite' =  'sites.id' WHERE  domaines.site' =  'sites.site'

Pour les quotes j'ai essayé plein de variantes, alors je ne crois pas que le problème vienne de là mais si c'est le cas, n'hésitez pas à corriger, cela va sans dire.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...