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] Jointure, Max et Group By


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 8
    Points : 9
    Points
    9
    Par défaut [Requête] Jointure, Max et Group By
    Salut à tous,

    J'ai actuellement à ma disposition 2 TABLES :
    La table ACCOUNT dans laquelle figure la liste de tous les joueurs avec leurs informations ( login,mdp,mail,nom,prenom etc)
    La table PARTIES dans laquelle figure la liste de toutes les parties de tous les joueurs (login, score, date etc)

    Ce que j'aimerai réaliser :

    Un classement par jour listant dans l'ordre décroissant la liste des joueurs ( nom, prénom )

    Contrainte 1 : l'information que je veux afficher est dispatché entre 2 tables : le prénom et le nom dans la table ACCOUNT et le score dans la table PARTIES
    Contrainte 2 : Dans la table PARTIES, il peut très bien y avoir plusieurs entrées du même joueur avec des scores différents, j'aimerai simplement récupérer le meilleur score à la date du jour
    Contrainte 3 : Filtrer le tout sur la date du jour ( pas compliqué à priori puisque je récupère ma date du jour en php avec une variable )

    Je bloque un peu et je ne sais pas vers quoi m'orienter sur le web pour trouver la réponse. Cependant je sais qu'il s'agit apparemment d'une requête de jointure, mais à vrai dire, je n'y comprends pas grand chose.


    Merci d'avance et bonne journée !

  2. #2
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select * from(
    select a1.nom,a1.prenom,max(score) max_score
    from account a1, parties a2
    where a1.login = a2.login
    and trunc(a2.date) = trunc(sysdate)
    group by a1.nom,a1.prenom)
    order by max_score desc

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    @JeanPlank78 : votre solution posera problème s'il y a des homonymes sur nom et prénom, il faut en ce cas grouper sur le login, qui lui est forcément unique, puis rechercher nom et prénom comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select MAIN.login
         , MAIN.nom
         , MAIN.prenom
         , MAXI.score
    from(select login,
              , max(score) as score
         from account  
         where trunc(date) = trunc(sysdate)
         group by login) as MAXI
    inner join parties as MAIN
       on MAIN.login = maxi.login
    order by score desc

    J'en ai profité pour remplacer la jointure à l'ancienne (where) par une jointure normalisée (join)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Salut,

    Tout d'abord merci pour vos réponses.

    En testant la première solution, PHPMYADMIN me ressort une erreur :
    "Every derived table must have its own alias "

    J'ai donc rajouté un alias au select comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select * from(
    select a1.nom,a1.prenom,max(score) max_score
    from gj_account a1, gj_parties a2
    where a1.login = a2.login
    and date = '2016-05-03'
    group by a1.nom,a1.prenom) as a3
    order by max_score desc
    Mais comme l'indique escartefigue, dans ma base, il est possible que deux personnes est le même nom et le même prénom ( très peu probable cependant, mais vaut mieux être prudent )

    Pour la deuxième solution, je ne comprends pas trop, tu sélectionnes le nom et prénom de la table qui a pour alias " MAIN " c'est à dire la table PARTIES, mais je n'ai aucun de ces champs dans ma base.

    Je suis donc parti de la première solution en changeant le GROUP BY nom et prénom par un GROUP BY login, et ça fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select * from(
    select a1.nom,a1.prenom,max(score) max_score
    from gj_account a1, gj_parties a2
    where a1.login = a2.login
    and date = '2016-05-03'
    group by a1.login) as a3
    order by max_score desc

    Merci beaucoup à tous les deux pour votre aide

  5. #5
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    Il a juste inversé les deux tables, change et ce sera bon

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par oweraz Voir le message
    Pour la deuxième solution, je ne comprends pas trop, tu sélectionnes le nom et prénom de la table qui a pour alias " MAIN " c'est à dire la table PARTIES, mais je n'ai aucun de ces champs dans ma base.
    Je suis donc parti de la première solution en changeant le GROUP BY nom et prénom par un GROUP BY login, et ça fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select * from(
    select a1.nom,a1.prenom,max(score) max_score
    from gj_account a1, gj_parties a2
    where a1.login = a2.login
    and date = '2016-05-03'
    group by a1.login) as a3
    order by max_score desc
    Attention : cette solution n'est applicable que sur MySQL qui accepte un groupage non cohérent avec les colonnes du select, à proscrire donc
    Reprenez effectivement ma requete en inversant le nom des tables comme l'a justement proposé JeanPlanck78, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select MAIN.login
         , MAIN.nom
         , MAIN.prenom
         , MAXI.score
    from(select login
              , max(score) as score
         from parties 
         where trunc(date) = trunc(sysdate)
         group by login) as MAXI
    inner join  account  as MAIN
       on MAIN.login = maxi.login
    order by score desc
    Ainsi vous aurez une solution adapatée au cas de doublons et standard tant au niveau jointure (inner join) qu'au niveau groupage et donc portable sur n'importe quel SGBD

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

Discussions similaires

  1. requête max avec group by
    Par nahoula1231 dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/03/2014, 10h44
  2. Requête avec max(), group by et having. je m'y perds
    Par hispanus dans le forum SQLite
    Réponses: 3
    Dernier message: 11/02/2010, 15h29
  3. Réponses: 8
    Dernier message: 28/10/2008, 14h00
  4. Requête avec MAX et GROUP BY (2)
    Par kmarcel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/02/2008, 12h55
  5. requête avec MAX et GROUP BY
    Par arcane dans le forum Langage SQL
    Réponses: 8
    Dernier message: 30/01/2008, 13h21

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