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

Langage SQL Discussion :

[Requête] Problème avec Distinct


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut [Requête] Problème avec Distinct
    Salut les sauveurs !!

    Je fais un site sur le Hockey, et je dois maintenant élaboré le classement.

    1ère Base de donnée : equipe

    noEquipe
    nomEquipe
    conference
    division


    2ème base de donné : classement

    noEquipe
    nomEquipe
    GJ
    W
    L
    OTL
    PTS

    De la facon que ça marche le classement pour ceux qui ne s'y connaisse pas en classement de la NHL. DOnc, 2 Conférence, 3 division par conférence

    http://www.tsn.ca/nhl/standings/


    Le problème : Lors de classement par conférence, je dois alors trouvé les 3 première équipe. Bref, la meilleur de chacune des 3 division.

    J,aimerais faire ma requête en une ligne. j'avais pensé à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT division, classement.nomEquipe, GJ, PTS FROM equipe, classement WHERE equipe.noEquipe = classement.noEquipe AND conference ='WEST' ORDER BY 'pts'
    Cela ne marche pas puisque si il trouve :

    division nomEquipe GJ PTS

    NorthWest Edmonton 11 2
    NorthWest Minnesota 10 6


    Et effectivement, ce sont 2 lignes différente.


    Je sais qu'une solution pourrais résider si je fais 3 requête différente ! mais c'est à éviter

    Avez vous des idées ? Merci !!!

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    Pourrais-tu STP préciser le SGBD utilisé ?

    Sinon, je n'ai tout capté : tu souhaites ramener les équipes qui ont le plus de points, mais je ne comprends pas le rôle des champs conférences et divisions ?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Salut,

    Tout d'abord, c'est quoi SGBD ? BD p-e pour base de donnée mais SG ?


    Alors, pour ton autre question, il faut comprendr ele fonctionnement du classement.

    2 Conférence
    6 Division ( 3 Division par conférence )

    La première équipe de chaque conférence ocupe les 3 premeire position de la conférence. Enr egardans le lien que jai donner ca donne une idée

    Merci

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Cf le dico de Developpez SGBD

    Je pense avoir compris en ce qui concerne ta problématique, juste une question : pour chaque conférence, tu souhaites la première de chaque division OU les 3 meilleures en points ? Ca ne donne pas forcément le même résultat ?

    Ex dans le lien que tu donnes, pour la conférence Western :
    Les 3 premières de chaque division sont :
    - Detroit
    - Calgary
    - Dallas

    Les 3 meilleures en points sont :
    - Detroit
    - Dallas
    - NashVille (2° de la division Central)

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Voici un jeu d'essai, créé avec le minimum de champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    CREATE TABLE Equipe (
    noEquipe NUMBER(2),
    Nom VARCHAR2(32),
    Conference NUMBER(1),
    Division NUMBER(1));
     
    CREATE TABLE Classement (
    noEquipe NUMBER(2),
    Points NUMBER(3));
     
    -- Conference Western = 2
    -- Division Central = 1, NorthWest = 2, Pacific = 3
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (1, 'Detroit', 2, 1);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (2, 'NashVille', 2, 1);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (11, 'Calgary', 2, 2);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (12, 'Vancouver', 2, 2);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (21, 'Dallas', 2, 3);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (22, 'Los Angeles', 2, 3);
     
    INSERT INTO Classement (noEquipe, Points) VALUES (1, 73);
    INSERT INTO Classement (noEquipe, Points) VALUES (2, 68);
    INSERT INTO Classement (noEquipe, Points) VALUES (11, 66);
    INSERT INTO Classement (noEquipe, Points) VALUES (12, 63);
    INSERT INTO Classement (noEquipe, Points) VALUES (21, 72);
    INSERT INTO Classement (noEquipe, Points) VALUES (22, 64);
     
    COMMIT;
    La requête suivante me donne le premier de chaque division :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> SELECT Conference, Division, E.noEquipe, Nom, Points
      2    FROM Equipe E, Classement C
      3   WHERE E.noEquipe = C.noEquipe
      4     AND Points = (SELECT MAX(Points) 
      5                     FROM Equipe E1, Classement C1
      6                    WHERE E1.noEquipe = C1.noEquipe
      7                       AND E1.Conference = E.Conference
      8                       AND E1.Division = E.Division);
     
    CONFERENCE   DIVISION   NOEQUIPE NOM                                  POINTS
    ---------- ---------- ---------- -------------------------------- ----------
             2          1          1 Detroit                                  73
             2          2         11 Calgary                                  66
             2          3         21 Dallas                                   72
    Is that what you wish, or not ?

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Wow,

    Oui effectivement ca marche.

    Il reste tout demême un léger problème. Si 2 équipe dans la même division ont le même nombre de points, je me retrouve alors avec 4 réponse dont 2 dans la même division.

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Conférence	Division	         Équipe	        PTS
    WEST		Pacific		Anaheim		18	
    WEST		Pacific		Phoenix		18
    WEST		NorthWest	         Calgary		17	
    WEST		Central		Nashville	         17
    Avec mes connaissance limité en SQl, je connais seulement DISTINCT pour enlever un "doublons", mais dans ce cas je ne peux aps l'utiliser.

    Es ce que tu peux encore m'aider ?

    Merci beaucoup !

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    En cas d'égalité en points, il existe sans doute un 2°, puis un 3° critère pour les départager, non ? Nombre de match gagnés, goal-average, etc. Il faut alors prendre ces notions en compte dans la base, ce que je n'ai pas fait ... Et là ça va devenir un poil plus compliqué

    Sous Quel SGBD Travailles-tu, tu ne me l'as pas dit : MySql ? Autre ? Sous quelle version ?

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Je travaille sous MySQL mon ami

    Oui en effet, ensuite on départage par Victoire et ensuite But Pour. Oui j'avoue que c'est compliquer et c'ets pour ça que j'ai demandé sur le forum.

    Heuireusement il y a des pro comme toi ! hehehe

    Je te emt de la pression pque moi je suis bloquer

    Merci !

  9. #9
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Gamleur84
    Je te met de la pression pque moi je suis bloquer
    Hum, désolé, j'ai craqué

    Bon, plus sérieusement, je peux te proposer un solution pour prendre en compte un 2° critère de tri, puis un 3°. Le problème, c'est qu'en cas d'égalité sur ces 2 ou 3 critères, la requête te retourneras 2 lignes ou plus pour une même division ! Ce genre de situation doit être assez fréquent en début de championnat, par exemple ...

    A ça, une solution, pourrait être de dire : ce n'est pas au SGBD de faire le boulot, mais à toi de t'assurer, dans ton code Php sans doute, de ne prendre qu'une ligne par division (cf http://sql.developpez.com/sqlaz/erreurs/#L9)

    Bon, je ne vais pas me défiler, et te proposer une solution :

    Voici mon jeu d'essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    CREATE TABLE Equipe (
    noEquipe NUMBER(2),
    Nom VARCHAR2(32),
    Conference NUMBER(1),
    Division NUMBER(1)); 
     
    CREATE TABLE Classement (
    noEquipe NUMBER(2),
    Points NUMBER(3),   -- Points 
    Gagnes NUMBER(2),   -- Nb de victoires
    ButMar NUMBER(4)    -- Nombre de buts marqués
    );
     
    -- Conference Western = 2
    -- Division Central = 1, NorthWest = 2, Pacific = 3
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (1, 'Detroit', 2, 1);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (2, 'NashVille', 2, 1);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (3, 'Columbus', 2, 1);
     
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (11, 'Calgary', 2, 2);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (12, 'Vancouver', 2, 2);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (13, 'Colorado', 2, 2);
     
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (21, 'Dallas', 2, 3);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (22, 'Los Angeles', 2, 3);
     INSERT INTO Equipe (noEquipe, Nom, Conference, Division) VALUES (23, 'Anaheim', 2, 3);
     
    -- Division 1 : pas de problèmes
    INSERT INTO Classement (noEquipe, Points, Gagnes, ButMar) VALUES (1, 73, 34, 250);
    INSERT INTO Classement (noEquipe, Points, Gagnes, ButMar) VALUES (2, 68, 30, 187);
    INSERT INTO Classement (noEquipe, Points, Gagnes, ButMar) VALUES (3, 65, 27, 150);
     
    -- Division 2 : égalités en points
    INSERT INTO Classement (noEquipe, Points, Gagnes, ButMar) VALUES (11, 66, 30, 241);
    INSERT INTO Classement (noEquipe, Points, Gagnes, ButMar) VALUES (12, 66, 28, 228);
    INSERT INTO Classement (noEquipe, Points, Gagnes, ButMar) VALUES (13, 63, 25, 168);
     
    -- Division 2 : égalités en points et en matchs gagnés
    INSERT INTO Classement (noEquipe, Points, Gagnes, ButMar) VALUES (21, 72, 34, 237);
    INSERT INTO Classement (noEquipe, Points, Gagnes, ButMar) VALUES (22, 72, 34, 180); 
    INSERT INTO Classement (noEquipe, Points, Gagnes, ButMar) VALUES (23, 64, 28, 153);
    Ici, la requête d'hier, qui ramène ceux dont le nombre de points est la MAX de chaque division, va nous ramener 5 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SQL> SELECT Conference, Division, E.noEquipe, Nom, Points
      2    FROM Equipe E, Classement C 
      3   WHERE E.noEquipe = C.noEquipe 
      4     AND Points = (SELECT MAX(Points) 
      5                     FROM Equipe E1, Classement C1
      6                    WHERE E1.noEquipe = C1.noEquipe
      7                      AND E1.Conference = E.Conference
      8                      AND E1.Division = E.Division); 
     
    CONFERENCE   DIVISION   NOEQUIPE NOM                                  POINTS
    ---------- ---------- ---------- -------------------------------- ----------
             2          1          1 Detroit                                  73
             2          2         11 Calgary                                  66
             2          2         12 Vancouver                                66
             2          3         21 Dallas                                   72
             2          3         22 Los Angeles                              72
    Il faut donc écrire une 2° sous-requête pour que le nombre de matchs gagnés soit le MAX pour cette conférence, cette division et ce nombre de points : ça donnera ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SQL> SELECT Conference, Division, E.noEquipe, Nom, Points
      2    FROM Equipe E, Classement C 
      3   WHERE E.noEquipe = C.noEquipe 
      4     AND C.Points =  (SELECT MAX(Points) 
      5                      FROM Equipe E1, Classement C1
      6                     WHERE E1.noEquipe = C1.noEquipe
      7                       AND E1.Conference = E.Conference
      8                       AND E1.Division = E.Division)
      9     AND C.Gagnes = (SELECT MAX(Gagnes)
     10                       FROM Equipe E2, Classement C2
     11                      WHERE E2.noEquipe = C2.noEquipe
     12                        AND E2.Conference = E.Conference
     13                        AND E2.Division = E.Division
     14                        AND C2.Points = C.Points);
     
    CONFERENCE   DIVISION   NOEQUIPE NOM                                  POINTS
    ---------- ---------- ---------- -------------------------------- ----------
             2          1          1 Detroit                                  73
             2          2         11 Calgary                                  66
             2          3         21 Dallas                                   72
             2          3         22 Los Angeles                              72
    Et là, pour la division 2, on ramène bien Calgary et pas Vancouver, à cause de la différence en nombre de matchs gagnés.

    Si tu as pigé le principe, à toi d'écrire la clause pour départager ceux qui ont le même nombre de points et de matchs gagnés

    Bon courage et @+,

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut


    On a un pro dans la place !! Effectivement ca marche !

    Merci, vraiment en plus de m'épater en règlant mon problème. C,est assez impressionnant le temps que tu as mis pour m'aider. Chose certain, si ta des besoin d'aide en SQL , ben je t'en dois une !!




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

Discussions similaires

  1. Problème avec DISTINCT
    Par nicocolt dans le forum Requêtes
    Réponses: 7
    Dernier message: 15/03/2007, 12h12
  2. [Requête]Problème avec requête max
    Par vcattin dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/03/2007, 15h49
  3. Problème de requête SQL avec DISTINCT et COUNT ?
    Par [ZiP] dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/01/2007, 17h11
  4. [Requête]Problème avec ORDER BY NZ
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2006, 20h27
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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