|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : mai 2012 Messages : 8 ![]() |
Bonjour à toutes et à tous
Que je vous explique mon problème. J’ai 2 tables. Une "eleves" Id, nom, prenom, age, taille, tel, email, ville, loisirs l’autre "eleves_recherche" Id, nom, prenom, age, taille, tel, email, ville, loisirs Le champ "loisirs" peut prendre plusieurs valeurs séparées par un point virgule. (lecture;natation;vélo) Je veux tout simplement rechercher des résultats dans la table "eleves" avec les critères de la table "eleves_recherche", en sachant que on a plusieurs lignes dans les 2 tables, et que pour les loisirs un qui correspond est suffisant Code :
Je vous remercie de bien vouloir m'aider |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() |
1) Pourquoi avoir deux tables avec la même structure ?
2) Votre modèle de données n'est pas normalisé ! Citation:
Vous avez donc la règle de gestion suivante : Un élève peut pratiquer plusieurs loisirs et un loisir peut être pratiqué par plusieurs élèves. Cette règle de gestion entraîne le morceau de MCD suivant : eleve -0,n----pratiquer----0,n- loisir Et ce MCD engendrera la création des tables suivantes : te_eleve_elv (elv_id, elv_nom...) te_loisir_lsr (lsr_id, lsr_nom...) tj_elv_pratiquer_lsr_epl (epl_id_eleve, epl_id_loisir...) Profitez-en aussi pour externaliser la ville afin de ne pas avoir plusieurs fois la même ville avec des orthographes différentes... Un élève habite dans une seule ville et une ville peut héberger plusieurs élèves. eleve -1,1----habiter----0,n- ville tr_ville_vil (vil_id, vil_nom...) te_eleve_elv (elv_id, elv_id_ville, elv_nom...) 3) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre ! 4) Il vaut mieux éviter la guerre des étoiles ! 5) Citation:
Votre requête va associer, pour chaque élève de la table eleves_recherche, tous ceux de la table eleves qui ont un âge supérieur ou égal ! 6) Nommez vos entités types au singulier car elles sont issues des règles de gestion qui décrivent ce qui se passe successivement pour 1 instance de chaque entité type. Voir les exemples que j'ai donnés plus haut. 7) Les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL qui ne sont composées que de colonnes et de lignes. Expliquez mieux votre besoin. J'ai l'impression que vous avez mélangé le modèle de données et le processus de recherche des données dans la BDD. Vous avez un gros besoin d'approfondir vos connaissances sur ce qu'est une base de données relationnelle et comment on s'en sert. N'hésitez pas à passer du temps sur le site de SQLPro.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
||
|
30
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mai 2012 Messages : 8 ![]() |
Merci pour votre réponse.
Il y a 2 tables car je veux que sa fonctionne un peu comme sur les réseaux sociaux. La table "eleves" représente les eleves inscrits sur le site. La table "eleves_recherche" est remplit par les élevés qui recherche un copain avec certaines critères, mais qui n'est pas encore dans la base. Au moment quand il y aura un il recevra un mail automatique. Entre temps les données de sa recherche sont stockées dans la table "eleves_recherche". Pour le champ loisirs il peut cocher plusieurs cases qui corresponds chacune à un loisir. C'est pour cela que je me retrouve coincé, et je cherche la solution pour débloquer rapidement. Merci beaucoup |
|
|
00
|
|
|
#4 |
![]() ![]() |
Et bien comme je te l'ai dit, comme ton modèle de données est mauvais, tu te retrouves coincé pour faire une requête qui serait simple avec un modèle normalisé.
Modifie ton modèle de données comme je l'ai indiqué car là tu vas droit dans le mur avec tes deux tables telles qu'elles sont faites !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : mai 2012 Messages : 8 ![]() |
Vous appelez quoi modèle normalisé?
|
|
|
00
|
|
|
#6 | |
![]() ![]() |
Je te renvoie vers la bible de fsmrel mais contente toi des têtes de chapitre et petites explications simples en parcurant le document parce que l'ensemble est plutôt complexe et demande du temps que je n'ai moi-même jamais pris pour absorber cette somme.
Voici par exemple la première définition de la 1ère forme normale et qui est assez simple à comprendre (chapitre 2.2 dans l'article référencé ci-dessus) : Citation:
Comme apparemment un élève peut déclarer plusieurs loisirs, il faut modéliser les données comme je l'ai fait dans ma première réponse.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
|
00
|
|
|
#7 | |||||
|
Expert Confirmé Sénior
![]() ![]() ![]() François de Sainte MarieSpécialiste en bases de données Inscription : septembre 2006 Messages : 3 710 ![]() |
Bonsoir,
Je ne sais pas si le concept de première forme normale (1NF ou 1FN) dit grand-chose à emialpina... Quoi qu’il en soit, il y a la lettre d’une part et l’esprit d’autre part. je rappelle que si l’attribut Loisirs est du type CHAR ou VARCHAR, la première forme normale est à la lettre respectée : elle serait violée si cet attribut était du type ARRAY (cf. PostgreSQL). En revanche, cette malheureuse première forme normale est évidemment bafouée dans l’esprit et l’on ne peut qu’être d’accord avec la recommandation que vous faites à emialpina de mettre en œuvre le type d’entité PRATIQUER s’il veut s’en sortir. Citation:
Disons que l’avantage qu’offre INNER JOIN par rapport à CROSS JOIN est celui de la lisibilité quand il y a plusieurs jointures. Selon la norme, la clause FROM doit respecter la syntaxe : FROM <Table reference> [, <Table reference> ...]Où Table reference peut notamment représenter un simple nom de table. Que l’on code Code SQL :
Code SQL :
Alors un optimiseur digne de ce nom ramène ces requêtes à quelque chose de commun. La bonne vieille expression antique et solennelle « A, B » a été baptisée CROSS JOIN par la norme SQL-92, mais cela ne change rien à l’affaire. Je me réfère en cela à A Guide to THE SQL STANDARD Third Edition par C.J. Date et Hugh Darwen. Pour mémoire, Darwen a longtemps représenté le Royaume-Uni au sein des comités qui font la norme (et fait remettre aux calendes la prise en compte de propositions qu'il a démontré comme étant invalides donc pour le moins dangereuses). Nonobstant mes remarques, les recommandations que vous faites à emialpina méritent un grand .
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|||||
|
|
10
|
|
|
#8 |
![]() ![]() |
Je me bats quotidiennement contre le non emploi de JOIN pour les jointures, ici et ailleurs.
Je ne compte plus le nombre de questions posées dans nos forums BDD que j'ai résoluées rien qu'en récrivant la requête avec JOIN ON en lieu et place de FROM WHERE. Et je suis ces temps professionnels ci quotidiennenment confronté à des requêtes contenant un bon paquet de jointures et je passe un temps certain à les récrire pour les comprendre. Je dois même avouer que les dernières que j'ai examinées m'ont laissées dans le doute sur la bonne manière d'ordonner les JOIN à cause de boucles dans les conditions de jointures ! Bref, quand je vois des jointures à l'ancienne, je fais comme toi face au bonhomme NULL, je sors ma sulfateuse !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
10
|
|
|
#9 | |||
|
Expert Confirmé Sénior
![]() ![]() ![]() François de Sainte MarieSpécialiste en bases de données Inscription : septembre 2006 Messages : 3 710 ![]() |
Citation:
![]() En tout cas, remerciez Chris Date d'avoir inventé la jointure moderne, laquelle a eu l'heur de séduire ceux qui font la norme SQL ! C'est l'occasion pour moi de rappeller ce que j'ai déjà écrit à ce sujet : « On peut aller jusqu’à dire que l’utilisation de la paire (FROM, WHERE) pour exprimer la jointure peut être considérée comme obsolète depuis 25 ans. En effet, c’est dans son ouvrage Relational Databases, Selected Writings, paru en 1986 que C. J. Date écrivit (chapitre 16, Outer join) :Etc.[...]We propose the introduction of an explicit JOIN operation into SQL —where the keyword JOIN refers specifically to the (inner or outer) natural join [...]et il fournit la BNF qui va bien : Bon, je vais aller me ravitailler en 12,7 mm (je travaille de préférence à la RIA de 50).
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|||
|
|
20
|
|
|
#10 |
|
Invité de passage
![]() Inscription : mai 2012 Messages : 8 ![]() |
Je vous remercie de vos réponses.
Je vous souhaite bonnes fêtes de fin d'année. A bientôt |
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() ![]() ![]() François de Sainte MarieSpécialiste en bases de données Inscription : septembre 2006 Messages : 3 710 ![]() |
Merci emialpina, et bonnes fêtes à vous aussi !
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com