Boumbadaboum Posté 27 Juillet 2005 Posté 27 Juillet 2005 Bonjour, Voilà j'ai du mal à trouver comment exécuter deux requetes SQL. Je suis sûr que pour quelqu'un d'expérimenté ce serait simple. J'explique. 1) J'ai une table avec un champ 'libelle'. Je veux créer un autre champ qui reprenne pour chaque tuple exactement le contenu du champ 'libelle' déjà existant. 2) J'ai deux table qui ont un champ en commun. Je veux recopier le contenu d'un champ de la table 1 dans un nouveau champ de la table 2, pour le tuple correspondant. Je me vois mal recopier le contenu de chaque champ, alors si quelqu'un a la solution, je lui dit merci d'avance.
Sarc Posté 27 Juillet 2005 Posté 27 Juillet 2005 Salut et bienvenue sur le hub C'est quoi un tuple ? 1) J'ai une table avec un champ 'libelle'. Je veux créer un autre champ qui reprenne pour chaque tuple exactement le contenu du champ 'libelle' déjà existant. Si tu as créé le champ dans MyAdmin, il te suffit de faire la requète : UPDATE nom_table SET nouveau_champ = libelle en remplaçant évidemment nom_table et nouveau_champ par les noms que tu as donné... Pour la 2 tu pourrais faire un petit script rapide
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 Ah merci à toi, je viens d'essayer ta premier solution ça a marché tt de suite. Un tuple sauf erreur de ma part c'est une ligne de ta table. Mettons t'as une table voiture avec 10 champs, chaque enregistrement c'est un tuple. Ne me frappez pas si je me trompe. Tu as une idée pour le "petit script"? Il doit bien y avoir une requete sql qui permet ça je pense. Merci déjà en tout cas pour la première réponse
erwinol Posté 27 Juillet 2005 Posté 27 Juillet 2005 (modifié) 1) J'ai une table avec un champ 'libelle'. Je veux créer un autre champ qui reprenne pour chaque tuple exactement le contenu du champ 'libelle' déjà existant. Une fois ton nouveau champ créé et puis tu fais un Update. UPDATE table T SET T.autreChamp=T.libelle Ca me semble assez évident jusque là. 2) J'ai deux table qui ont un champ en commun. Je veux recopier le contenu d'un champ de la table 1 dans un nouveau champ de la table 2, pour le tuple correspondant. <{POST_SNAPBACK}> J'imagine que tu as un identifiant commun dans les 2 table. Donc tu ajoutes le champ dans la table2 et tu fais : UPDATE table1 T1, table2 T2 SET T2.champ=T1.champ WHERE T1.id=T2.id Si ça ne donne pas le résultat désiré, n'hésite pas à revenir. Et au passage, n'oublie pas de faire un backup avant C'est quoi un tuple ? <{POST_SNAPBACK}> Un enregistrement. Modifié 27 Juillet 2005 par erwinol
erwinol Posté 27 Juillet 2005 Posté 27 Juillet 2005 Un tuple sauf erreur de ma part c'est une ligne de ta table.Mettons t'as une table voiture avec 10 champs, chaque enregistrement c'est un tuple. Ne me frappez pas si je me trompe. <{POST_SNAPBACK}> T'es sauf pour cette fois, c'est correct !
TheRec Posté 27 Juillet 2005 Posté 27 Juillet 2005 (modifié) Un tuple c'est , en mathématique, un élément d'un produit cartésien... générlameent, lorsqu'on parle d'une base de données, c'est simplement un ligne d'une table composée de plus d'un champ. En anglais c'est appelé un n-uplet ... Pour en revenir au problème de Boumbadaboum, 1> je suppose que tu veux le "recopier" dans une autre table, car dans la même table cela n'a pas trop de sens...En fait je vais répondre à ta deuxième question également, c'est typiquement dans ce genre de cas qu'il faut créer une relation entre les tables. Sous mySQL pas de moyen de contraindre tes relations entre les table (pas de procédures stockées,...) , mais pour une requête SELECT tu as la clause JOIN .. par exemple : SELECT table2.*, table1.libelle AS libelle FROM table2 LEFT OUTER JOIN table1 ON table2.idlibelle = table1.idlibelle Plus d'aide sur les JOIN : http://www.w3schools.com/sql/sql_join.asp *EDIT* Pardon pour la redite ;D je rédigeais ma réponse et quelqu'un m'a devancé ;D Modifié 27 Juillet 2005 par TheRec
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 Ok merci j'essaye ça dès que j'ai fini mes crèpes. Je vous dit le résultat. au passage, n'oublie pas de faire un backup C'est quoi un backup? Tu veux dire une sauvegarde au cas ou la table grille? J'en ai déjà fait une demi douzaine avant et je les ai expédié un peu partout sur mes boites mail et d'autres pc lol Parano? Qui a dit ça? Bon je vous dis si ça a marché merci.
TheRec Posté 27 Juillet 2005 Posté 27 Juillet 2005 (modifié) Je n'ai vonlontairement pas parlé d'UPDATE, recopier les champs est également une possibilité, mais pour être franc je ne te conseille pas ce procédé à moins que tes tables soient situées sur 2 bases de données distinctes et qu'elle doivent pouvoir être indépendantes. Les relations servent (pas uniquement...il y a évidemment une notion d'abstration aussi, ...) à éviter les répétions de données qui sont généralement sources d'erreurs et de problèmes lors de changement manuel dans les champs. Bref à toi de juger de l'importance de l'homogénéité de tes données. *EDIT* On est jamais assez parano dans le monde de l'informatique... Modifié 27 Juillet 2005 par TheRec
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 Bon alors voilà j'ai fini mes crèpes je reprend. Je viens de tester cela pour la deuxième requête (première résolue donc): UPDATE definitions, annuaire SET annuaire.categorie = definitions.categorie WHERE definitions.libelle = annuaire.libelleDef. J'obtiens: #1064 - You have an error in your SQL syntax near ' annuaire SET annuaire.categorie = definitions.categorie WHERE definitions.libel' at line 1 Le but est donc de copier le contenu du champ categorie de la table definition dans le champ categorie de la table annuaire. ça vous dit quoi? (ok je m'attend à un truc du genre "ta requête vaut deux balles, t'as pas vu la grosse tache en plein milieu, vas dormir et tout... mais bon je persévère ! ) Merci d'avance
Sarc Posté 27 Juillet 2005 Posté 27 Juillet 2005 Bon après avoir répondu naïvement au début, je me suis mis à réfléchir... Moi je veux bien t'aider à faire ce que tu veux, mais est-ce vraiment une solution ? Je vois déjà pas l'intérêt de faire deux colonnes avec les mêmes informations, et je dirais "encore moins recopier les infos dans une autre table"... Pourquoi tu fais ça ? Comme l'a dit quelqu'un avant moi, au moment d'aller chercher tes infos tu peux les piocher dans plusieurs tables, pour que tu te retrouves à la fin avec les bons résultats, donc les recopier dans une autre table, est-ce vraiment la meilleure solution ?
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 Bien en fait le résultat souhaité est le suivant: Quand une définition est sélectionnée (c'est pour un dico), des liens en rapport s'affichent. Les définitions sont dans la table Definition, les liens dans la table Annuaire. Je peux trier les définitions par catégorie. Mais maintenant je veux trier aussi les liens de l'annuaire par catégorie pour une nouvelle rubrique du site (pas en ligne encore). Comme les liens comportent un libelle commun avec la table definitions la catégorie de la définition "satellite" est la même que pour les liens "satellite" de la table annuaire. Donc si je ne veux pas recopier pour chaque tuple de la table annuaire le contenu du champ catégorie du tuple correspondant de la table definitions, je dois trouver la bonne requête qui va le faire directement. C'est tout. Maintenant si vous avez une solution révolutionnaire à me proposer j'écoute hein.
Sarc Posté 27 Juillet 2005 Posté 27 Juillet 2005 Si tu as un lien entre les deux tables, ce que tu sembles dire, ça ne pose pas de problèmes... Tu peux donner la structure exacte de ta BDD, avec les colonnes en commun ? C'est lors de la recherche des résultats que tu auras une requète sur plusieurs tables...
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 Bien en fait je ne vais pas détailler toute la structure des deux tables ça me semble fastidieux. Voila pour les champs commun entre la table definitions et la table annuaire: - definitions.libelle = annuaire.libelleDef (pas le même nom de champ mais même contenu, est-ce un prb?) - definitions.categorie = annuaire.categorie. avant l'id des liens étaient le même que l'id des définitions mais je vais trouver une autre relation avec un nouveau champ déjà créé. Donc la question est bien de transvaser les catégories de la table definitions vers la table annuaire en sachant que le point commun entre chaque tuple est le contenu des champs libelle (table definitions) et libelleDef (table annuaire). C'est mon premier site dynamique soyez indulgent svp
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 Bon sinon rq j'en ai pas pour trois heures: Je fais un select de tous les libelles de la table definitions pour une categorie et j'insère ensuite la categorie pour tous les libelleDef ayant le même contenu dans la table annuaire. Y'a que 8 catégories. Mais bon il doit y avoir une requête pour faire ça d'un coup.
TheRec Posté 27 Juillet 2005 Posté 27 Juillet 2005 (modifié) Le fait que tu n'ai pas le même nom de champs (colonne) ne pose pas de problème pour la relation, tant que tu déclare cette colonne comme clé étrangère, ou clé primaire selon le cas. Maintenant décrire ta base de données est assez important dans la mesure ou la structure inluence la/les requêtes que nous alons te proposer...si tu veux faire rapide il y a ce programme pour la modélisation : http://www.fabforce.net/dbdesigner4/ C'est gratuit et pas très compliqué. Cela nous aidera beaucoup je pense... *EDIT* Je viens de relire un peu l'ensemble du post, en fait, ce que tu souhaite réaliser avec tes définition c'est réaliser une relation plusieurs à plusieurs ou n à n ... Tu devras donc passer par une table intermédiraire du type : | idMot | idMotProche | -------------------------- | 1 | 23 | | 3 | 12 | | 1 | 5 | idMot et idMotProche sont en fait liés à la même table, on relie des tuples de la même table entre eux... Maintenant cette table sera générée par ton application, les enregistrement peuvent être réciproques au moment de récupérer les mots proches : 1 -> 23 et 23 -> 1 par exemple... Si tu travail exculsivement sur des mots proche orthographiquement tu peux utiliser des algorithmes de compraison de mots aulieu de faire la correspondance manuellement par cette table intermédiaire. C'est à voir, tout dépends du type de mot a "rapprocher" PS: Sorry pour le long EDIT... Modifié 27 Juillet 2005 par TheRec
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 (modifié) PS: Sorry pour le long EDIT... Bah non c'est sympa mais bon j'ai rien compris. J'en reviens pas que ça soit si long pour une requête alors que pour la première des deux, ça a été réglé du premier coup. En tout cas félicitations, ça marche webmaster-hub, on a des réponses :-) Modifié 27 Juillet 2005 par Boumbadaboum
Sarc Posté 27 Juillet 2005 Posté 27 Juillet 2005 - definitions.libelle = annuaire.libelleDef (pas le même nom de champ mais même contenu, est-ce un prb?) En fait ce que tu pourras faire quand tu voudras afficher les sites... Je pense que tu auras dans ta page de la définition la variable $libelle qui correspondra à la définition ? Il te suffira juste de faire un SELECT url FROM annuaire WHERE libelleDef = $libelle Il te faut quoi d'autre en fait ?
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 Bah je veux bien comprendre ce que sont les index et à quoi ils servent, quand les utiliser etc... parce que je suis en train de refaire la base au propre et je me posais la question justement Je veux bien un chalet en bois, un jardin, quelques poules, un chien ou deux, un percheron, une petite piscine, des sapins aussi. Sinon ça va, merci
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 Oui plus sérieusement: J'utilise la requête ci-dessous pour remplir les champs catégories de ma table annuaire UPDATE `annuaire` SET `categorie` = 'sociale' WHERE `libelleDef` = 'ambiance' ; Bon comme j'ai plusieurs champs libelleDef qui ont le même contenu je fais 5 ou 6 tuples à chaque fois. Mais tout de même à chaque fois je dois copier coller la requete et changer le libelleDef du WHERE (c'est clair?) Donc je voudrais en une seule grosse requete mettre à jour toute la table du genre: UPDATE `annuaire` SET `categorie` = 'sociale' WHERE `libelleDef` = 'ambiance' OR 'libelleDef'='mars' OR 'libelleDef'='navette' etc.... Bon, mais c'est quoi la bonne requête?
TheRec Posté 27 Juillet 2005 Posté 27 Juillet 2005 (modifié) Donc la c'est plus une question c'est un cours sur les systèmes de bases de données relationnelles que tu veux... ça doit se trouver ;D http://www.commentcamarche.net/ Sous la rubrique Bases de données tu les conceptes fondamentaux dont tu as besoin sous "Initiation" et "Modèle relationnel"... PS+EDIT : Je continue à dire que une représentation graphique de ta base nous serait utile... Modifié 27 Juillet 2005 par TheRec
Dan Posté 27 Juillet 2005 Posté 27 Juillet 2005 UPDATE `annuaire` SET `categorie` = 'sociale' WHERE `libelleDef` in ('ambiance','mars','navette') Dan
Boumbadaboum Posté 27 Juillet 2005 Auteur Posté 27 Juillet 2005 (modifié) Donc la c'est plus une question c'est un cours sur les systèmes de bases de données relationnelles que tu veux... Je suis vexé non je rigole, merci pour tout et je vais approfondir la théorie. Modifié 27 Juillet 2005 par Boumbadaboum
TheRec Posté 27 Juillet 2005 Posté 27 Juillet 2005 Bah..pas de quoi se vexer Dan à la rescousse, comme d'hab On le remerie jamais assez alors : MERCI ! Toutefois, Boumbadaboum, si tu dois effectuer de telles opérations c'est que il a un problème d'abstraction dans la structure de ta base de données, avoir des données redondantes dans une base n'est pas la solution la plus efficace...Mais c'est "tolérable" (ne soyons pas plus royaliste que le roi..) pour une application d'envergure raisonnable... Bonne chance dans tes futures aventures de "base-de-donnée-esques" Et surtout bonne nuit ! (Non mais c'est pas des heures pour être debout ça...tantpis, je suis assis de toute façon... )
Boumbadaboum Posté 28 Juillet 2005 Auteur Posté 28 Juillet 2005 il a un problème d'abstraction dans la structure de ta base de données C'est quoi un "problème d'abstraction"?
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant