|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 19 ![]() |
Bonjour à tous,
Voilà j'ai un problème concernant une requête SQL assez tordu (en tout cas dans ma tête Voilà j'ai les trois tables suivantes :
Ce que je cherche à faire (avec MySQL et sans PHP) c'est de récupérer (en deux champs) :
Alors avec ceci : Code :
Code :
Alors voilà après avoir posé mon problème, à votre avis c'est ma requête qui est tordu ou ma BDD ? Comment faire à votre avis pour aboutir au résultat ? Merci d'avance ! |
||||||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Qu'est ce que ça donne:
Code :
|
||
|
|
10
|
|
|
#3 |
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 19 ![]() |
MAGNIFIQUE !!!
Ça à marché !! Comme quoi ça change tout de savoir ! Ça donne envie d'en apprendre plus ! Merci Skuatamad ![]() Une petite question... À quoi correspond le dernier petit t ? Je l'ai supprimé pour voir et j'obtiens l'erreur : "#1248 - Every derived table must have its own alias" Je comprends donc qu'il faut le laisser et que je pourrais par exemple écrire pour le tout premier SELECT : t.nom ; Mais quel en est l'intérêt ? Dernière question j'ai voulu par exemple filtré les gagnants par équipe (il y a un champ equipe dans la table individu)... Je comprend facilement qu'il faille rajouter AND i.equipe = 'A'... Du coup pour tester je l'ai placé :
Aussi, à des fin de test (et d'apprentissage) j'ai essayé ces différentes solutions :
En fait comme j'avais pas appris à l'époque à faire les jointure avec les mot-clé JOIN mais plutôt avec des clauses WHERE en série (j'ai lu au passage que cette méthode n'était pas recommendé) ça m'a l'air un peu confus tout ça et je souhaiterai acquérir les bonnes pratiques.. En tout cas merci encore !! |
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Il est parfaitement inutile dans ce cas mais comme tu l'as constaté sans alias mysql ronchonne. Citation:
Il existe certains cas où il faut placer (pour répondre au besoin) le filtre dans la clause de jointure (le ON) mais cela concerne les jointures externes : http://sqlpro.developpez.com/cours/s...ures/#LIII-D-3 Pour les jointures internes c'est inutile. Citation:
http://sqlpro.developpez.com/cours/sqlaz/jointures/ |
|||
|
|
00
|
|
|
#5 | |
![]() ![]() |
Citation:
En principe, la clé primaire d'une table associative est composée des identifiants des entités participant à l'association si les cardinalités maximales sont à n ou du seul identifiant de l'entité ayant les cardinalités 0,1 dans le cas d'une association (x,n - 0,1). Donc si tu as cette association : Individu -0,n----Posséder----0,n- Ballon => possede (idIndividu, idBallon, etat) Un ballon peut toujours être possédé par plusieurs personnes ! Si tu as cette association : Individu -0,n----Posséder----0,1- Ballon => possede (idBallon, idIndividu, etat)
__________________
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 ! |
|
|
00
|
|
|
#6 | |
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 19 ![]() |
Désolé pour le délai...
Citation:
L'idéal serait donc que je revois mes tables... Sinon comment êtes vous arrivé à cette conclusion ? Le fait que idIndividu et idBallon ne soient pas des clés (soulignés) suffit-il pour dire qu'ils s'agissent de cardinalité 0-n ? En fait si j'étais parti en mettant (id,idIndividu, idBallon) C'est parce que je voulais ajouter une option de date pour avoir un historique des possesseurs... Mais du coup cela implique des contraintes d'intégrité... A ce sujet j'avais une question... Existe-t-il un mécanisme en SQL (avec MySQL en l'occurence) qui permette en supprimant un tuple d'une table (t1) de supprimer dans les autres tables tous les tuples dont la clé est un des attribut du tuple supprimé (de la table t1) ? En fait je le fait manuellement connaissant la BDD, mais c'est vraiment manuel et sans garanti d'être dépourvu d'oubli... |
|
|
|
00
|
|
|
#7 | ||||
![]() ![]() |
Citation:
Individu -0,n----Posséder----1,1- Ballon Ce qui donne une clé étrangère dans la table Ballon, référençant l'identifiant de l'individu qui le possède : Ballon (id, id_proprietaire, couleur, etat...) Ou bien, si le ballon peut ne pas être possédé : Individu -0,n----Posséder----0,1- Ballon Et cette fois on a une table associative, pour empêcher l'apparition du bonhomme NULL dans la clé étrangère, donc la clé primaire est l'identifiant du ballon : Posseder (id_ballon, id_proprietaire) Citation:
Citation:
Individu -0,n----Posséder----(0,n)- Ballon Date -(0,n)--------------| Les cardinalités entre parenthèses indiquent une identification relative, ce qui signifie que l'association "posséder" sera identifiée par le ballon et la date et implique qu'un ballon ne peut être possédé qu'une seule fois à une certaine date. Ceci donne la table associative suivante : posseder (id_ballon, date_possession, id_proprietaire) Citation:
Et puisque tu utilises MySQL, il faut utiliser le moteur InnoDB pour bénéficier des contraintes de clé étrangère.
__________________
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 ! |
||||
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 19 ![]() |
Merci pour toutes ces précisions...
Je vais revoir un peu tout cela et selon les besoins je vais voir si je ne vais pas tout remettre à plat et refaire la conception en bonne et due forme.. Dans tout les cas merci encore à CinePhil pour les précisions et surtout à skuatamad pour sa réponse.. Je bascule en résolu (même si par rapport au titre ce n'est pas un IF mais plutôt un CASE...) |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com