Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQL : Trier selon le nombre d'occurences avec répétition

Sans GROUP BY quoi...

Sujet résolu
    17 juin 2010 à 1:15:39

    Bonjour,

    Je travaille sur une page où je dois dresser le palmarès d'un championnat. Mais je souhaiterais changer l'ordre de tri. Non pas un tri chronologique comme ceci :

    année | champion
    2000     Michel
    2001     Christophe
    2002     Adrien
    2003     Adrien
    2004     Michel
    2005     Michel
    2006     Étienne
    2007     Adrien
    2008     Roger
    2009     Adrien
    2010     Christophe


    Mais un tri selon les champions les plus titrés comme ici :

    année | champion
    2002     Adrien
    2003     Adrien
    2007     Adrien
    2009     Adrien
    2000     Michel
    2004     Michel
    2005     Michel
    2001     Christophe
    2010     Christophe
    2006     Étienne
    2008     Roger


    J'ai cherché sur le net mais je n'ai rien trouvé de concluant :

    * GROUP BY ne fonctionne pas car il regroupe les occurrences (on n'a qu'un "Adrien", un "Michel", etc.)
    * COUNT (*) AS number et à la fin de la requête ORDER BY number ne fonctionne pas du tout chez moi (peut-être lié à ce que j'explique plus bas mais en même temps, COUNT renvoie un nombre, non ? Et comment peut-on trier "par un nombre" ?)

    Pour afficher le tableau, j'utilise une boucle (for). Sinon, j'utilise 8 requêtes SQL (une générale pour la boucle, une pour la date de la requête générale, puis 1 requête par place du championnat (il y en a 6) et pour ces 6 dernières requêtes, il y a une jointure entre la table "championnat" et "membres".

    Pouvez-vous m'aider s'il-vous-plait ? Des pistes de solution, des idées seraient les bienvenues. Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      17 juin 2010 à 1:22:24

      Salut,

      avec ORDER BY.

      $sql = mysql_query('SELECT * FROM tatable ORDER BY champion');
      • Partager sur Facebook
      • Partager sur Twitter
        17 juin 2010 à 1:26:43

        Il ne veut pas un tri alphabétique.

        Tu n'as pas spécifié quel SGBDR tu utilises, je suppose donc que tu utilises un SGBDR assez développé pour connaître les fonctions analytiques (donc pas MySQL) :

        SELECT annee, champion, COUNT(*) OVER(PARTITION BY champion) AS nbrChamp
        FROM championnats
        ORDER BY nbrChamp, champion, annee
        


        Si deux champions ont gagné le même nombre de championnat, c'est trié par ordre alphabétique.

        Cette question devrait d'ailleurs être posée dans le forum Base de données, je vais alerter les modérateurs pour qu'ils déplacent.
        • Partager sur Facebook
        • Partager sur Twitter
          17 juin 2010 à 1:29:32

          Oh putain, j'étais vraiment à l'ouest dans ma réponse lol. La fatigue surement dsl.

          Sinon ben je dirais comme toi fayden.
          • Partager sur Facebook
          • Partager sur Twitter
            17 juin 2010 à 1:38:36

            Distrait comme je suis, j'ai oublié de dire le SGBDR que j'utilise (peut pas être parfait lors de mon premier post !). Bien sûr, le drame, c'est que j'utilise... MySQL.

            Donc la solution de Fayden ne marche pas (sur MySQL), et en effet, la solution de Revolucion propose juste un tri alphabétique ^^.

            Du coup, mon "exigence" est-elle possible en "simple" MySQL ?

            (Désolé de m'être trompé de forum, j'ai associé bêtement PHP et Base de données :-° )
            • Partager sur Facebook
            • Partager sur Twitter
              17 juin 2010 à 1:43:23

              Oui, c'est possible. Un peu plus lourd, mais bon, 'faut faire avec :

              SELECT c.annee, c.champion
              FROM championnats c
              INNER JOIN
                  (
                      SELECT champion, COUNT(*) AS nbrChampionnats
                      FROM championnats
                      GROUP BY champion
                  ) a
                  ON a.champion = c.champion
              ORDER BY nbrChampionnats, champion, annee;
              


              Ça doit ressembler à ça, pas le temps de vérifier si c'est exactement comme ça mais tu devrais pouvoir adapter selon tes besoins.
              • Partager sur Facebook
              • Partager sur Twitter
                17 juin 2010 à 2:00:50

                C'est absolument ça ! J'ignorais totalement qu'on pouvait insérer du SELECT et compagnie dans un INNER JOIN.

                J'ai inséré ce que tu m'as indiqué, Fayden, et ça fonctionne parfaitement. J'ai juste ajouté un " DESC" après "nbrChampionnats" car je trouve plus logique que les plus titrés apparaissent en premier.
                J'ai maintenant des lignes de malade (double INNER JOIN dans un sql) mais ça roule.

                Enfin, plus que le code, c'est vraiment l'idée qui m'a beaucoup aidé ! Un très grand merci ! Et quelle rapidité de réponse malgré l'heure tardive (enfin en Europe du moins ^^). Merci beaucoup à vous deux et je vous souhaite une bonne nuit ! (En plus de m'avoir aidé sur le code, vous m'avez sauvé d'une nuit blanche ! Super :D )
                • Partager sur Facebook
                • Partager sur Twitter

                SQL : Trier selon le nombre d'occurences avec répétition

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown