|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Fanny MaeInscription : mai 2011 Messages : 4 ![]() |
Bonsoir,
je souhaite une petite aide ou du moins une piste pour mon problème. je n'arrive plus à réfléchir correctement, je bloque. J'ai 2 tables table 1 : une table de mots clés - mkeyoa id nom 1 autofoncage 2 autoripage 3 berlinoise 4 grutage 5 micropieu 6 hydrocampe 7 ripage ... table 2 : une table de sites - siteoa dans laquelle des ouvrages sont listés et pour lesquels au maximum 5 mots-clés permettent de les caractériser dans leur méthode de construction, on peut donc avoir parfois juste 3 mots-clés. id nom key1 key2 key3 key4 key5 1 Pont Cheran 2 3 0 0 0 2 Viaduc Hautille 5 2 1 7 0 3 Viaduc Biollay 5 6 4 0 0 4 Viaduc Fonds 5 3 0 0 0 5 Viaduc Plantes 5 7 1 0 0 6 Viaduc Enfer 1 6 3 2 4 7 Tunnel Chava 2 3 4 0 0 8 Viaduc Chava 5 7 1 4 0 dans cette table 2, les mots clés (key1, ..., key5) sont remplacés par les ID de la table 1, qui pour l'instant comportent 7 mots clés mais il y en aura à terme entre 40 et 50. Donc cela me semblait plus pratique d'avoir les ID comme repère... mon problème : je veux connaître les ouvrages faits avec "ripage" - (ID 7) là, c'est bon, mon SELECT est simple, j'en trouve 3 je les affiche. je transforme ensuite les résultats (ici les noms des sites) en url. je voudrais qu'en cliquant sur un des sites s'affichent tous les mots-clés qui le caractérisent, en plus du "ripage". pour l'instant, j'arrive à afficher la liste des ID (de key1 à key5), même les nulles. Code php :
je n'ai pas trouvé comment faire afficher les 5 mot-clés, pas leur ID et donc à faire référence aux infos stockés dans la table 1... :-( je n'arrive pas à imaginer ma requête... est-ce que les JOINTURES sont la solution ? http://mysql.developpez.com/faq/?page=SYNTAXE_JOINTURES Merci d'avance. |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Bonjour,
Il faut faire une jointure sur chaque clé, et des jointures externes pour traiter les id à 0 : Code :
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
||
|
|
10
|
|
|
#3 |
![]() ![]() |
Il faudrait surtout modifier la structure de la BDD qui a été mal conçue !
![]() Un site pouvant avoir plusieurs mots clés et un mot clé pouvant s'appliquer à plusieurs sites, il faudrait une table associative : mkeyoa (id, nom) siteoa (id, nom site_mkey (id_site, id_mkey)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
10
|
|
|
#4 |
|
Invité de passage
![]() Fanny MaeInscription : mai 2011 Messages : 4 ![]() |
très intéressant.
grand merci. ![]() je n'ai plus qu'à travailler ou à revoir intégralement ma base. j'ai essayé d'abord la solution de ced : je ne comprends pas la syntaxe de la requête que tu m'as fournie comme piste : SELECT s.id, s.nom, k1.nom AS key1, k2.nom AS key2, k3.nom AS key3, k4.nom AS key4, k5.nom AS key5 FROM siteoa s ... je n'ai pas vu dans les tutoriaux ce moyen de "renommer" une table dans une requête. FROM siteoa s ==> tu renommes siteoa en s ??? ce qui te permettrait de sélectionner s.id s.nom etc... est-ce que c'est çà ? autre point : comment tu peux faire k1.nom ? je n'ai pas de table nom... et je ne pense pas qu'il s'agit de la table mkeyoa... je n'ai rien compris en fait. je crois que je suis bonne pour un aspro 1000 j'ai essayé plusieurs requêtes en essayant de comprendre ta proposition mais j'arrive à un résultat que je n'avais pas eu jusqu'ici : http://5090.net/c et entre par exemple ripage ou hydrocampe ... merci de tes lumières si possible. |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 850 ![]() |
oui c'est le surnommage qui permet d'avoir un alias...
![]() par contre comme dit cinephil ta bd est très mal conçue là il te faudrait une table de liaison: relation(id,idpont,idcle) qui relit alors tes tables: ponts(id,nom,cheran) et cles(id,nom) et là tu peux mettre un nombre variable de clés pour chaque pont et rechercher avec une pauvre jointure externe gauche tous les ponts avec telle ou telle clé ou l'inverse en gros tout ce qui est fixe dans tes tables reste dedans, tout ce qui a un nombre variable d'apparitions est remplacer par la table de liaison... de manière plus formelle c'est le principe de normalisation des tables qui fait en sorte de scinder une grosse table en une table de référence et des tables dépendantes (données n'apparaissant qu'une seul fois comme l'age d'une personne) ou en passant par une table de liaison (données pouvant être multiple, comme l'adresse d'une personne qui peut en avoir plusieurs par exemple) refais déjà tes tables correctement et ça te simplifiera la vie énormément
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#6 | |||
|
Invité de passage
![]() Fanny MaeInscription : mai 2011 Messages : 4 ![]() |
Bonjour à tous.
J'ai donc suivi vos conseils, j'ai refondu les tables. Par contre, ne possédant pas (de très loin) toutes les subtilités de MySQL, je n'ai pas cette vision sur "ce qui serait possible" de faire en "mieux". Ce qui explique pourquoi mes tables sont *très* mal conçues... ![]() Code :
J'ai toujours les mêmes problèmes : 1. Comment lier la table SITE aux tables MOT CLE (mkeyoa, mkeytl, ...) ?Avec la contrainte suivante, qu'avait soulevé CinePhil : Citation:
J'ai plusieurs tables de mots-clés car plusieurs domaines de compétence existent : Ouvrage d' Art, Télécoms, etc. Je ne sais pas si je fais une table de mots clés uniques ou si je les segmente (ce que j'ai fait). Merci de votre aide. |
|||
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 850 ![]() |
par définition, des table avec la même structure et sémantique = 1 seule table
si tu veux séparé les valeurs des différentes tables rajoute une colonne qui contiendra un index avec une valeur par ancienne table -> moins de fichiers ouverts pour analysé les tables (3 fichiers minimum par table pour info) -> ne pas confondre recherche par un pauvre humain dans une table et ce que sait faire un ordi (un humain adore les chaine de caractère plus que des recherche sur indexes numériques, l'ordi c'est totalement l'inverse) -> quand tu as des valeurs en chaine de caractères répétitive, faut penser à les remplacer par un index vers une table contenant ces valeurs -> plus compact en terme de taille fichier et souvent une jointure très rapide à faire -> 1 caractère utf8 = 1 à 5 octets pour mémoire, si tu as un type varchar c'est la taille voulue qui est allouée, si c'est du type char c'est le max de caractère x 5) pour lier de manière ouverte des entrées de 2 tables, comme je te l'ai déjà dit, on utilise une table de liaison:
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
10
|
|
|
#8 |
![]() ![]() |
Pour apprendre à modéliser correctement une BDD, vois le cours de SQLPro et les livres de Michel Diviné.
1) Table "ligne" a) Tes lignes vont d'une ville à une autre. Tu devrais donc avoir une table des villes et l'associer deux fois à la table des lignes : MCD : ligne -1,1----partir----0,n- ville |--------1,1----arriver----0,n---| Tables : ville_vil (vil_id, vil_nom, vil_abreviation...) ligne_lgn (lgn_id, lgn_id_ville_depart, lgn_id_ville_arrivee...) Dans l'absolu, ont pourrait même faire une identification relative ! MCD : ligne -(1,1)----partir----0,n- ville |--------(1,1)----arriver----0,n---| Tables : ville_vil (vil_id, vil_nom, vil_abreviation...) ligne_lgn (lgn_id_ville_depart, lgn_id_ville_arrivee...) Mais restons simples pour la suite, sans oublier toutefois de placer une contrainte d'unicité (index de type UNIQUE chez MySQL) sur le couple {lgn_id_ville_depart, lgn_id_ville_arrivee} de manière à ne pas créer deux fois la même ligne. b) Les colonnes "region" et "siege" devraient être externalisées dans des tables de référence. MCD : ligne -1,1----dependre----0,n- region |--------1,1----siéger----0,n- ville Si une région n'a qu'un siège, le MCD devient celui-ci : ligne -1,1----dependre----0,n- region -1,1----sieger----0,n- ville Tables : region_rgn (rgn_id, rgn_id_ville_siege, rgn_nom, rgn_abreviation) ligne_lgn (lgn_idlgn_id_ville_depart, lgn_id_ville_arrivee, lgn_id_region...) 2) Table site Puisque certains sites sont des ouvrages, avec un attribut supplémentaire, mais pas tous, tu devrais faire un héritage. MCD : ouvrage -(1,1)----Être----0,1- site Tables : site_ste (ste_id, ste_id_ligne, ste_nom, ste_point_kilometrique) ouvrage_ovg (ovg_id, ovg_dimension) 3) Table mkeyoa Puisque tu dis que la description est facultative, ne rends pas la colonne NOT NULL ! Au contraire, mets-là à DEFAULT NULL ! 4) Tables mkey Comme l'a dit Éric, inutile de faire plusieurs tables de mots-clés, une seule suffit. 5) Association entre les mots-clés et les sites Comme dit Éric, il te faut une table associative, mais contrairement à lui, je ne lui donne pas d'identifiant propre. L'identifiant d'une table associative est composé des identifiants des tables entrant en jeu dans l'association. MCD : site -0,n----Assoccier----0,n- mot_cle Tables : site_ste (ste_id, ste_id_ligne, ste_nom, ste_point_kilometrique) mot_cle_mk (mk_id, mk_mot, mk_description) ste_associer_mk_sam (sam_id_site, sam_id_mot_cle) Bon courage pour la suite !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
10
|
|
|
#9 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 850 ![]() |
oui cinéphil a raison:
l'index supplémentaire dans la table des mot clé est uniquement à mettre dans un but de filtrage par thématique et/ou en cas de double de mots clé entre thématiques mais c'est plus utile pour la génération de l'interface de saisie ... en gros, dans ta bd tout n'est pas forcément utilisé à tout moment ! le gros du travail du sgbd doit être de brasser des indexes numériques pour la recherche des éléments correspondants à ce que tu veux (et le moins possible de chercher dans des champs char,varchar,text par exemple)... les données autres sont rapatriées pour la restitution finale dans les ihm si tu suis ces principes, tu auras toujours quelque chose d'efficace normalement j'essaye de te le dire d'une manière moins formelle que cinephil mais on dit la même chose
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
10
|
|
|
#10 | |
|
Invité de passage
![]() Fanny MaeInscription : mai 2011 Messages : 4 ![]() |
mon code n'est peut-être pas optimisé mais je suis arrivé à mes fins avec la toute première info : Citation:
merci à vous pour vos conseils, tutoriaux, etc. |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com