Jump to content
Sign in to follow this  
Guest meeeuuuhhh

Update ou Insert ou...

Rate this topic

Recommended Posts

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

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Edited by meeeuuuhhh

Share this post


Link to post
Share on other sites

"meeeuuuhhh", si tu n'as pas les bases, comment veux tu comprendre ce que je te donne comme solution ?

Tu dois faire un script php car Mysql ne supporte pas les requêtes imbriquées.

Je ne sais pas comment le dire autrement.

Cadeau : http://www.phpdebutant.org/ :)

Portekoi

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

ReRe,

Je ne peux pas t'aider plus. Un débutant qui ne veut pas apprendre, c'est la première fois que je vois ca.

Bon courage

Portekoi

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Edited by meeeuuuhhh

Share this post


Link to post
Share on other 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".

Share this post


Link to post
Share on other 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 !

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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'

Edited by meeeuuuhhh

Share this post


Link to post
Share on other 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]

Edited by NorSeb

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other sites

Tu es sur que le nom de la table est correct ? Tu fais ca directement avec PhpMyAdmin ?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Le problème vient de là si : enlève toutes les quotes et ca devrait être bon :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...