IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Aide requête SQL


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Par défaut [Résolu] Aide requête SQL
    Bonjour,

    J'ai besoin de vos lumières pour réaliser une requête SQL...
    Voici mes tables concernées :

    Je cherche à remonter les nom des clubs de toutes les rencontres dont un club précis fait partie.

    Moi j'en suis là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT club.nom AS 'Club Visité', club2.nom AS 'Club Visiteur', rencontre_has_equipe_visite.equipe_id_equipe, rencontre_has_equipe_visiteuse.equipe_id_equipe
    FROM equipe, equipe AS equipe2, club, club AS club2, club_has_equipe, rencontre_has_equipe_visite, rencontre_has_equipe_visiteuse
    WHERE club.nom = 'TOTO'
    AND equipe.categorie = 'Nationale'
    AND club_has_equipe.club_id_club = club.id_club AND club_has_equipe.club_id_club = club2.id_club
    AND club_has_equipe.equipe_id_equipe = equipe.id_equipe AND club_has_equipe.equipe_id_equipe = equipe2.id_equipe
    AND (rencontre_has_equipe_visite.equipe_id_equipe != rencontre_has_equipe_visiteuse.equipe_id_equipe AND (rencontre_has_equipe_visite.equipe_id_equipe = equipe.id_equipe OR rencontre_has_equipe_visiteuse.equipe_id_equipe = equipe.id_equipe));
    Sauf que je n'arrive jamais à obtenir les bons noms de clubs alors que les id des equipes sont corrects (le nom du club auquel est associé l'equipe 3 est TITI):
    TOTO TOTO 1 3
    TOTO TOTO 3 1

    Une idée..?

    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je cherche à remonter les nom des clubs de toutes les rencontres dont un club précis fait partie.
    D'après ta requête, tu ne cherches que les équipes de catégorie 'Nationale'.
    D'après la structure de la table 'equipe', il peut y avoir une équipe 'Nationale' en 2007, une autre en 2008...
    Il y a donc déjà redondance de données puisqu'on répète le mot 'Nationale' pour des saisions différentes, et que la saison ('2008-2009') est répétée pour plusieurs équipes.

    Je serais plutôt parti sur la structure suivante :
    Club -1,n----Avoir----1,1- Equipe -1,1----Représenter----0,n- Catégorie
    Saison -0,n----Jouer----0,n---|

    Ce qui se lit :
    1) Un club a de 1 à plusieurs équipes et une équipe est dans un seul club.
    2) Une équipe représente une catégorie et une catégorie peut être représentée par plusieurs équipes.
    3) Une équipe peut jouer plusieurs saisons et une saison peut voir jouer plusieurs équipes.

    Ceci étant dit, revenons à ta structure...
    Il manque semble t-il un morceau de ton schéma. La table 'rencontre_has_equipe_visite' laisse supposer qu'il existe une table 'rencontre'.
    Cela suppose aussi le schéma suivant :
    Rencontre -1,n----ComprendreVisiteur----0,n- Equipe

    Comme il y a le complément dans la requête, je complète le schéma :
    Rencontre -1,n----ComprendreVisitée----0,n- Equipe
    |----------------1,n----ComprendreVisiteuse----0,n---|

    Autrement dit, une rencontre rassemble plusieurs équipes visitées et plusieurs équipes visiteuses.
    C'est quel sport ?
    La catégorie 'Nationale' m'a fait penser au foot mais peut-être ai-je interprété trop vite ?

    Venons-en à la requête qui est pour le moins rébarbative à lire et à comprendre parce qu'elle est écrite avec la syntaxe de jointure obsolète depuis 1992...
    J'ai essayé de la réécrire avec la syntaxe normalisée et j'ai découvert que dans la dernière parenthèse du WHERE, on s'adresse deux fois à la table equipe alors que je pense qu'il aurait fallu s'adresser aux deux instances différentes de cette table.
    Ca donneriat ce qui suit, avec des alias pour alléger la requête et une mise en forme qui facilite la lecture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT c1.nom AS 'Club Visité', 
      club2.nom AS 'Club Visiteur', 
      r1.equipe_id_equipe, 
      r2.equipe_id_equipe
    FROM club_has_equipe AS che
    INNER JOIN club AS c1 ON che.club_id_club = c1.id_club
    INNER JOIN club AS c2 ON che.club_id_club = c2.id_club
    INNER JOIN equipe AS e1 ON che_id_equipe = e1.id_equipe
      INNER JOIN rencontre_has_equipe_visite AS r1 ON r1.equipe_id_equipe = e1.id_equipe
    INNER JOIN equipe AS e2 ON che.equipe_id_equipe = e2.id_equipe
      INNER JOIN rencontre_has_equipe_visiteuse AS r2 ON r2.equipe_id_equipe = e2.id_equipe
    WHERE club.nom = 'TOTO'
      AND equipe.categorie = 'Nationale'
      AND r1.equipe_id_equipe <> r2.equipe_id_equipe
    Maintenant, de là à savoir si ça marche... La structure de la BDD me semble bizarre alors difficile de se prononcer.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Par défaut
    Merci de ton aide CinePhil

    Je sais que ma structure de bd n'est pas logique...
    Je l'ai créé avec DBDesigner et j'ai du mal à construire les tables telles que je souhaiterai les écrire à la main. Du coup j'ai mis des tables d'association un peut partout pour arriver à mes fins

    Autrement je suis d'accord avec les cardinalités et la redondance de la catégorie... Par contre comment conserver un historique par saison si une équipe peut jouer plusieurs saisons ?

    En ce qui concerne la requête j'ai passé "club2.nom AS 'Club Visiteur'" en "c2.nom AS 'Club Visiteur'" et "che_id_equipe" en "che.equipe_id_equipe" mais j'ai ensuite des erreurs sur :
    - Unknown column 'club.nom' in 'where clause'
    - Unknown column 'equipe.categorie' in 'where clause'

    Si je les transforme en c1.nom et e1.categorie et bien plus d'erreur mais pas de résultat...

    Penses-tu que je doive refaire ma structure de db ou cela peut-il fonctionner comme cela ?
    Et est-tu disposé à me donner un coup de main pour le faire ?

    Merci encore.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je pense que tu devrais refaire la structure de la base si ce n'est pas trop tard (pas déjà exploité).

    Par contre comment conserver un historique par saison si une équipe peut jouer plusieurs saisons ?
    Une rencontre entre deux équipes (c'est bien du foot ou un sport à une équipe contre une autre ?) a lieu à une certaine date, donc lors d'une certaine saison.

    L'historique de l'équipe est conservé dans la table des rencontres.

    Je reprends ma structure :
    Club -1,n----Avoir----1,1- Equipe -1,1----Représenter----0,n- Catégorie
    Saison -0,n----Jouer----0,n---|

    La relation entre Saison et équipe indique seulement que l'équipe existe lors de cette saison. Il se pourrait en effet que, faute d'effectif suffisant, une équipe soit supprimée lors d'une saison.

    Passons à la modélisation des rencontres...
    Ca va être difficile en format texte !

    Saison -1,n----Comprendre----1,1- Rencontre
    Equipe -0,n----Visiter----1,1-----------|
    |-------0,n----Recevoir----1,1------------|

    Il faut ajouter une exclusion entre les associations Visiter et Recevoir (se représente par un X dans un cercle relié aux deux associations par un pointillé).

    Traduction :
    - Une saison comprend plusieurs rencontres et une rencontre est comprise dans une seule saison.
    - Une équipe peut visiter lors de plusieurs rencontres et une rencontre n'a qu'une équipe visiteuse.
    - Une équipe peut recevoir lors de plusieurs rencontres et une rencontre n'a qu'une équipe receveuse.
    - L'équipe qui visite n'est pas la même que l'équipe qui reçoit.

    Ceci nous donnerait les tables :
    Club (CLU_Id, CLU_Nom...)
    Categorie (CAT_Id, CAT_Libelle...)
    Saison (SAI_Id, SAI_Annees...)
    Equipe (EQU_Id, EQU_Nom, EQU_IdCategorie, EQU_IDClub...)
    Rencontre (RCN_Id, RCN_IdSaison, RCN_IdEquipeReceveuse, RCN_IdEquipeVisiteuse...)

    On ajoute une contrainte d'unicité sur le triplet (RCN_IdSaison, RCN_IdEquipeReceveuse, RCN_IdEquipeVisiteuse) et ça traduit correctement le schéma.

    Je reprends ton besoin :
    Je cherche à remonter les nom des clubs de toutes les rencontres dont un club précis fait partie.
    Ca donnerait la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT cr.CLU_Nom AS Club_receveur, er.EQU_Nom AS Equipe_receveuse,
      cv.CLU_Nom AS Club_visiteur, ev.EQU_Nom AS Equipe_Visiteuse
    FROM Rencontres AS r
    INNER JOIN Saison AS s ON r.RCN_IdSaison = s.SAI_Id
    INNER JOIN Equipe AS er ON r.RCN_IdEquipeReceveuse = er.EQU_Id
      INNER JOIN Club AS cr ON er.EQU_IDClub = cr.CLU_Id
      INNER JOIN Categorie AS ctr ON er.EQU_IdCategorie = ctr.CAT_Id
    INNER JOIN Equipe AS ev ON r.RCN_IdEquipeVisiteuse = ev.EQU_Id
      INNER JOIN Club AS cv ON ev.EQU_IDClub = cv.CLU_Id
      INNER JOIN Categorie AS ctv ON ev.EQU_IdCategorie = ctv.CAT_Id
     
    WHERE (ctr.CAT_Libelle = 'National' OR ctv.CAT_Libelle = 'National')
      AND (cr.CLU_Nom = 'TFC' OR cv.CLU_Nom = 'TFC')
      AND s.SAI_Annees = '2008-2009'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Par défaut
    Merci pour toutes ces précisions

    Mon problème est que dans DBDesigner je n'arrive pas à créer 2 clés étrangères entre équipe et rencontre... Je vais devoir les faire à la main ou connais-tu un autre éditeur de MCD pouvant générer directement les tables pour MySql ?


    Pour info, c'est pour le site d'un club de volley...

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Essaie avec MySQL Workbench. Ce n'est pas du MCD mais directement du modèle entity/relation.
    Commence par faire les entités puis tu les relies en choisisant le type de relation et ça crée automatiquement les tables associatives si nécessaire.
    Par contre, la version gratuite de MySQL Workbench ne te donnera pas le lien avec la BDD mais peut te générer les requêtes de création qu'il faut ensuite lancer dans MySQL.

    Et pense à choisir le type de tables InnoDB si tu veux bénéficier des contraintes de clés étrangères.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/11/2007, 22h23
  2. Aide Requête SQL
    Par jjg65 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/07/2007, 10h37
  3. Aide requête SQL - UPDATE phpmyadmin
    Par laulau37 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/06/2007, 10h19
  4. Aide requête sql
    Par viny dans le forum PostgreSQL
    Réponses: 18
    Dernier message: 14/09/2006, 21h31
  5. Aide Requête SQL (UPDATE)
    Par Glowprod dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/07/2006, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo