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 :

MySql - requête (order by) - en alternance


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Par défaut MySql - requête (order by) - en alternance
    Bonjour,
    Je voudrais réaliser un tri un peu spécifique en SQL (db MySql). Mes données sont classées de la mannière suivante :

    Nom joueur 1 | Groupe A | score = 100
    Nom joueur 2 | Groupe A | score = 56
    Nom joueur 3 | Group A | score = 99
    Nom joueur 4 | Groupe B | score = 241
    Nom joueur 5 | Groupe B | score = 78
    Nom joueur 6 | Group B | score = 22
    Nom joueur 7 | Groupe C | score = 47
    Nom joueur 8 | Groupe C | score = 26
    Nom joueur 9 | Group C | score = 412

    Je cherche une requête SQL (order by) qui pourrait m'afficher les résultats des scores et des groupes par "alternance". Meilleur score groupe A, meilleur score groupe B, ... deuxième meilleur score groupe A, deuxième meilleur score groupe B, ...
    Exemple :

    Score 412 | groupe C | Nom joueur ...
    Score 241 | groupe B | Nom joueur ...
    Score 100 | groupe A | Nom joueur ...

    Score 99 | groupe A | Nom joueur ...
    Score 48 | groupe B | Nom joueur ...
    Score 47 | groupe C | Nom joueur ...

    Score 56 | groupe A | Nom joueur ...
    Score 26 | groupe C | Nom joueur ...
    Score 22 | groupe B | Nom joueur ...

    Je n'ai pas trouvé d'information sur la clause GROUP BY ou autre qui pourrait m'afficher ce type de résultat.

    Quelqu'un a-t-il une idée?

    Merci,

    GazGaz

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Problématique de classement intéressante, (car nous parlons bien ici de rangement dans un ordre et non d'un filtrage de données)
    La première question qui me vient à l'esprit est combien y-a-t'il de groupes, juste A, B et C ou peut-il y en avoir d'autres ?
    La deuxième question est : la répartition dans les groupes est-elle homogène ?
    Ensuite, si j'ai bien étudier ton exemple, au sein d'un rang, le classement doit s'opérer par score décroissant, c'est cela ?

    J'allais oublier, que fait-on des ex-aequo ?

    Je vois mal comment réaliser cela en SQL de base mais, je ne doute pas qu'en SQL procédural qqun fournira une réponse.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    En attendant, essaye cela
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t1.groupe, t1.joueur,t1.score, COUNT(t2.*) as rang
    FROM latable t1
    LEFT JOIN latable t2
    ON t2.score <= t1.score 
    AND t2.groupe=t1.groupe
    GROUP BY rang,t1.groupe, t1.score
    ORDER BY rang, t1.score,t1.groupe
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Non, il ne faut pas grouper par rang (je ne crois pas qu'on puisse au demeurant).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t1.groupe, t1.joueur,t1.score, COUNT(t2.*) AS rang
    FROM latable t1
    LEFT JOIN latable t2
    ON t2.score <= t1.score 
    AND t2.groupe=t1.groupe
    GROUP BY t1.groupe, t1.joueur,t1.score
    ORDER BY rang, t1.score
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut Maljuna Kris,

    si j'ai bien compris ta requête, je pense que l'ordre doit être fait dans l'autre sens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t1.groupe, t1.joueur,t1.score, COUNT(t2.score) AS rang
    FROM latable t1
    LEFT JOIN latable t2
    ON t2.score <= t1.score 
    AND t2.groupe=t1.groupe
    GROUP BY t1.groupe, t1.joueur,t1.score
    ORDER BY rang desc, t1.score desc
    sinon, je pense que ton idée est une bonne piste pour arriver au résultat

    A+

    Michel

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par Cybher Voir le message
    je pense que l'ordre doit être fait dans l'autre sens
    DESC, bien sûr, j'oublie tout le temps que c'est SORT UP par defaut.
    Quel boulet !


    Quoique DESC pour le score, mais ASC pour le rang.

    Donc moitié boulet, hémisphère en qqe sorte
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Par défaut Hello
    Merci pour vos réponses.
    Réponse au premier messsage:
    - Il y a un nombre indéterminé de groupes
    - Un groupe peut contenir un nombre indéterminé de joueurs et le nombre de joueurs par groupe est différent d'un groupe à l'autre
    - oui, le score s'affiche par ordre décroissant
    - s'il y a un ex-aequo, cela suit la même logique ... l'affichage se fait au rang suivant si le groupe a déjà été affiché dans le rang courant

    J'avais oublié de mentionné que le score n'étai pas une donnée brut isncrite dans la table. Le score est calculé à la volée selon différents critères (en core plus facile pour trouver la solution ;-) )

    Dans ton exemple, le join se fait bien sur la même table ?

    Merci

  8. #8
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    donc il risque d'y avoir un problème pour les ex-aequo...

    la jointure se fait bien sur la même table,
    l'idée de la requête est de compter le nombre de fois où chaque élément a des scores plus petit que lui. En gros, plus il a de scores plus petit que lui, mieux il est classé.

    par contre cela va donner des problèmes en cas de ex-aequo puisqu'ils auront le même "rang"

    Edit : et si le score n'est pas une donnée brute, cela risque de devenir mission impossible

  9. #9
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par julienleg Voir le message
    Dans ton exemple, le join se fait bien sur la même table ?
    Ben voui, c'est pour compter les autres joueurs qui ont un score supérieur ou égal au joueur courant.

    En te répondant je me rend compte que j'ai inversé l'opérateur de comparaison dans l'auto-non-équijointure.
    Il faut mettre ON t2.score >= t1.score

    Et donc Cybher avait raison sur toute la ligne avec ses DESC.

    Maintenant s'il faut d'abord calculer le score par SUM et GROUP BY sur le joueur, il va falloir tout repenser du début.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  10. #10
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Bon, je m'y colle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT t1.groupe, t1.joueur,t1.score, COUNT(t2.score) AS rang
    FROM (SELECT groupe,joueur,SUM(points) AS score
    FROM latable 
    GROUP BY joueur) AS t1
    LEFT JOIN (SELECT groupe,joueur,SUM(points) AS score
    FROM latable 
    GROUP BY joueur) AS t2
    ON t2.score >= t1.score 
    AND t2.groupe=t1.groupe
    GROUP BY t1.groupe, t1.joueur,t1.score
    ORDER BY rang, t1.score DESC
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  11. #11
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    Re,

    comme je l'ai dit plus haut, le gros problème va être la gestion des ex-aequo
    s'il y a un ex-aequo, cela suit la même logique ... l'affichage se fait au rang suivant si le groupe a déjà été affiché dans le rang courant
    avec ce type de requête, on aura le même rang donc on se retrouvera dans le même groupe
    et je ne vois pas comment faire pour les distinguer d'une manière simple

Discussions similaires

  1. requéte order by double?
    Par kanzarih dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/05/2006, 20h25
  2. [Mysql] requête multi-criteres
    Par Nick_59 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 20/04/2006, 14h43
  3. [php-mysql] requête qui ne marche pas....
    Par sanosuke85 dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/01/2006, 17h18
  4. [MYSQL] Problème ORDER BY sur deux champs
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 8
    Dernier message: 14/10/2005, 16h46
  5. requête order by + group by ?
    Par isa38 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/07/2005, 14h42

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