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 :

Les 3 meilleures deuxiemes !


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Points : 56
    Points
    56
    Par défaut Les 3 meilleures deuxiemes !
    Bonjour,

    Je suis en train de gérérer un script PHP pour la gestion d'un tournoi de foot.

    J'ai 4 tables Mysql dans ma base correspondante chacune à une poule de 5 équipes.

    Groupe 1 (nom de table)
    En gras les champs
    Equipe 1 joue 1 gagne 1 nul 0 perdu0 diff+5
    Equipe 2
    Equipe 3
    Equipe 4
    Equipe 5

    Groupe 2 (nom de table)
    En gras les champs
    Equipe 1 joue 1 gagne 1 nul 0 perdu0 diff+5
    Equipe 2
    Equipe 3
    Equipe 4
    Equipe 5

    ...etc jusqu'à 5 groupes de 5 equipes.

    Ensuite avec du PHP je cree un classement pour chaque groupe par ordre croissant su 1er au 5e.

    Je souhaiterais maintenant créer un deuxieme classement où je reprendrais que les 2e de chaque groupe et ensuite avec PHP colorier que les cellules des 3 meilleures deuxiemes et je sèche un peu sur la requete SQL associée sachant que mes groupes sont dans des tables différentes.

    Quelqu'un peut-il m'aider pour la requête SQL ?

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 018
    Points : 23 710
    Points
    23 710
    Par défaut
    Bonjour,

    Comment établies-tu le classement (une victoire vaut combien de points, un nul combien de points...) ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par ced Voir le message
    Bonjour,

    Comment établies-tu le classement (une victoire vaut combien de points, un nul combien de points...) ?

    ced
    Bonjour Ced

    Une victoire =3 pts
    Un nul = 1pt
    Une défaite = 0 pt

    Si ca peut t'aider à m'éclairer en fait pour chaque groupe j'effectue un classement en fonction du groupe. Ensuite j'établie un deuxieme classement pour me lister tous les deuxiemes de chaque groupe donc les 5 équipes deuxiemes de chaque classement. Dans ce classement je colorie les 3 premiers donc les 3 meilleurs deuxieme des 5 groupes. Je ne sais pas si c'est plus clair ainsi. Maintenant ma difficulté c'est d'établir la requête sql pour recupérer à chaque fois les 2e de chaque groupe. Ensuite après je me débrouille avec PHP pour faire le classement !

    Merci en tous cas !

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 018
    Points : 23 710
    Points
    23 710
    Par défaut
    Bon, alors je vais essayer d'expliquer un peu la démarche pour arriver à ce que tu souhaites .

    D'abord, voilà la requête qui te donne en un seul coup tous les classements de chaque groupe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select 'groupe1' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts
    from groupe1 g
    union all
    select 'groupe2' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts
    from groupe2 g
    union all
    select 'groupe3' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts
    from groupe3 g
    union all
    select 'groupe4' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts
    from groupe4 g
    order by groupe, pts desc, diff desc
    Je crée une colonne fictive que j'appelle "groupe" pour signaler à quel groupe appartient chaque équipe. Je calcule également le nombre de points de chaque équipe (ce que j'appelle "pts").

    Ensuite, ça se complique un petit peu. Dans la requête suivante, je calcul le classement de chaque équipe au sein de chaque groupe. Pour un seul groupe (disons le groupe1), ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select 'groupe4' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + perdu as pts, (
      select count(*)
      from groupe4 g1
      where (3 * g1.gagne + g1.nul) > (3 * g.gagne + g.nul)
      or ((3 * g1.gagne + g1.nul) = (3 * g.gagne + g.nul) and g1.diff > g.diff)
    ) + 1 as rang
    from groupe4 g
    Le classement est donné par la colonne "rang" (celle issue de la sous-requête un peu complexe ).

    Bien, maintenant, je mixe les 2 requêtes pour avoir tous les groupes avec tous les classements :
    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
    select 'groupe1' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts, (
      select count(*)
      from groupe1 g1
      where (3 * g1.gagne + g1.nul) > (3 * g.gagne + g.nul)
      or ((3 * g1.gagne + g1.nul) = (3 * g.gagne + g.nul) and g1.diff > g.diff)
    ) + 1 as rang
    from groupe1 g
    union all
    select 'groupe2' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts, (
      select count(*)
      from groupe2 g1
      where (3 * g1.gagne + g1.nul) > (3 * g.gagne + g.nul)
      or ((3 * g1.gagne + g1.nul) = (3 * g.gagne + g.nul) and g1.diff > g.diff)
    ) + 1 as rang
    from groupe2 g
    union all
    select 'groupe3' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts, (
      select count(*)
      from groupe3 g1
      where (3 * g1.gagne + g1.nul) > (3 * g.gagne + g.nul)
      or ((3 * g1.gagne + g1.nul) = (3 * g.gagne + g.nul) and g1.diff > g.diff)
    ) + 1 as rang
    from groupe3 g
    union all
    select 'groupe4' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + perdu as pts, (
      select count(*)
      from groupe4 g1
      where (3 * g1.gagne + g1.nul) > (3 * g.gagne + g.nul)
      or ((3 * g1.gagne + g1.nul) = (3 * g.gagne + g.nul) and g1.diff > g.diff)
    ) + 1 as rang
    from groupe4 g
    order by groupe, pts desc, diff desc
    Ne reste plus, dans cette super-requête, qu'à sélectionner les équipes de rang 2, ce qui oblige à mettre la requête dans un select (ça se complique de plus en plus ) :
    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
    select * from (
      select 'groupe1' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts, (
        select count(*)
        from groupe1 g1
        where (3 * g1.gagne + g1.nul) > (3 * g.gagne + g.nul)
        or ((3 * g1.gagne + g1.nul) = (3 * g.gagne + g.nul) and g1.diff > g.diff)
      ) + 1 as rang
      from groupe1 g
      union all
      select 'groupe2' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts, (
        select count(*)
        from groupe2 g1
        where (3 * g1.gagne + g1.nul) > (3 * g.gagne + g.nul)
        or ((3 * g1.gagne + g1.nul) = (3 * g.gagne + g.nul) and g1.diff > g.diff)
      ) + 1 as rang
      from groupe2 g
      union all
      select 'groupe3' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + nul as pts, (
        select count(*)
        from groupe3 g1
        where (3 * g1.gagne + g1.nul) > (3 * g.gagne + g.nul)
        or ((3 * g1.gagne + g1.nul) = (3 * g.gagne + g.nul) and g1.diff > g.diff)
      ) + 1 as rang
      from groupe3 g
      union all
      select 'groupe4' as groupe, equipe, joue, gagne, nul, perdu, diff, 3 * gagne + perdu as pts, (
        select count(*)
        from groupe4 g1
        where (3 * g1.gagne + g1.nul) > (3 * g.gagne + g.nul)
        or ((3 * g1.gagne + g1.nul) = (3 * g.gagne + g.nul) and g1.diff > g.diff)
      ) + 1 as rang
      from groupe4 g
    ) as t
    where t.rang = 2
    Tout ça pour mettre la condition finale sur le rang.

    Une fois là, je te laisse le soin de sélectionner tes meilleurs seconds. C'est toujours faisable en SQL, il suffit de trier par points, différence dans la table t, et de faire un LIMIT...

    Pour simplifier les étapes, tu peux aussi passer par des tables temporaires, ça évite de se trimbaler plusieurs niveaux de SELECT imbriqués .

    ced

    PS : je viens de faire exploser mon record de lignes de codes dans un même post
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Points : 56
    Points
    56
    Par défaut
    LOOL Mal à la tête !!!!

    Bon, je vais voir ça en rentrant ce soir chez moi !

    Je te tiens au courant pour la suite mais merci quand même !

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

Discussions similaires

  1. Selectionner les 5 meilleurs enregistrements
    Par Davboc dans le forum SQL
    Réponses: 6
    Dernier message: 12/09/2007, 22h24
  2. requète les 5 meilleurs résultats par catégorie
    Par Samcool dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 27/07/2007, 09h40
  3. comment ne retenir que les 25 meilleurs ?
    Par drasia dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 11/07/2007, 06h26
  4. Fichier séquentiel : garder les 5 meilleurs joueurs
    Par theterro dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/05/2006, 10h59
  5. [HTML] utiliser les DIV (meilleur que les tableaux?)
    Par atomic-greg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/04/2006, 12h19

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