Partage
  • Partager sur Facebook
  • Partager sur Twitter

[MySQL] Group By ordonné ?

Sujet résolu
    20 septembre 2011 à 15:56:09

    Bonjour,

    J'ai des objets. Chaque objet à une date de publication, une thématique, et une propriété "is_pinned". Maintenant j'aimerai une requête renvoyant le dernier objet pour chaque thématique, et si un objet is pinned existe, l'avoir d'abord :
    -- Données :
    objet          thematic           published_at            is_pinned
    a              toto               10/01/2011              0
    b              toto               01/01/2011              1
    c              tata               20/01/2011              0

    -- Résultat souhaité :
    tata           c                  20/01/2011              0
    toto           b                  01/01/2011              1


    J'ai pensé à une requête comme cela, mais le "order by" n'est pas pris en compte :
    SELECT thematic, objet, published_at, is_pinned FROM objet GROUP BY thematic ORDER BY is_pinned, published_at

    Mais cela renvoie :
    tata           c                  20/01/2011              0
    toto           a                  10/01/2011              0


    quelqu'un aurait une solution / explication ?

    merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
    MysterTy a sa mysterty-cave. Vous êtes célibataire ? Wantedlove est fait pour vous. C'est 100% gratuit !
      20 septembre 2011 à 16:50:15

      Hello

      En fait, les valeurs "published at" et "is_pinned" de ton résultat souhaité n'ont aucun sens: lors du group by avec ton jeu de données, deux groupes seront créés: un groupe contenant les tuples {a, toto, 10/01/2011, 0} et {b, toto, 01/01/2011, 1} et un autre groupe contenant l'unique tuple {c, tata, 20/01/2011, 0}

      Tu demandes d'afficher tous les éléments du groupe, mais comment MySQL est-il sensé savoir quel date il doit renvoyer pour le premier groupe ? Il a en fait le choix entre deux réponses, et tu n'as aucun moyen de savoir quelle date sera renvoyée pour le premier tuple.

      Du coup, bien sûr, faire un ORDER BY sur de telles données n'a pas beaucoup de sens non plus.

      De plus, GROUP BY "contient" un ORDER BY, donc en faisant GROUP BY thematic, ta requête contient également un ORDER BY thematic, qui selon toute apparence a la priorité par rapport aux deux autres ORDER BY. (Ceci n'est qu'une supposition, je ne mettrais pas ma main à couper :p)
      • Partager sur Facebook
      • Partager sur Twitter
        20 septembre 2011 à 17:00:30

        Bonjour, merci pour ton explication, seulement y aurait-il une solution pour résoudre ce problème ?

        En effet, après tout cela semble logique de pouvoir récupérer pour chaque groupe le dernier résultat...
        • Partager sur Facebook
        • Partager sur Twitter
        MysterTy a sa mysterty-cave. Vous êtes célibataire ? Wantedlove est fait pour vous. C'est 100% gratuit !
          20 septembre 2011 à 17:16:38

          Cette requête fait-elle ce que tu souhaites ?

          SELECT *
          FROM nom_de_ta_table t
          WHERE NOT EXISTS (
          SELECT * FROM nom_de_ta_table c WHERE t.thematic = c.thematic AND (
          c.is_pinned > t_is_pinned OR c.is_pinned = t.is_pinned AND c.published_at > t.published_at));
          
          • Partager sur Facebook
          • Partager sur Twitter
            21 septembre 2011 à 9:42:21

            certe, ça fonctionne.

            Je suis pas sûr de bien piger pourquoi, mais ça marche... Toutefois je trouve ça quand même très lourd, surtout que ma vraie requête est déjà balèze ! :s

            Il n'existe pas un moyen plus simple ? (genre un paramètre dans la config MySQL pour autoriser les orderby après les groupby ?
            • Partager sur Facebook
            • Partager sur Twitter
            MysterTy a sa mysterty-cave. Vous êtes célibataire ? Wantedlove est fait pour vous. C'est 100% gratuit !
              21 septembre 2011 à 13:40:35

              Il existe d'autres moyens pour faire ce genre de requêtes, mais avec MySQL, tu vas devoir te satisfaire de quelque chose de moins performant.

              Et non, ORDER BY ne fait pas magiquement tout ce que tu souhaites.
              • Partager sur Facebook
              • Partager sur Twitter
                21 septembre 2011 à 14:29:41

                Citation : Fayden

                Il existe d'autres moyens pour faire ce genre de requêtes, mais avec MySQL, tu vas devoir te satisfaire de quelque chose de moins performant.


                Donc, simple curiosité, il y aurait d'autre SGBD qui permettraient de le faire ?

                Citation : Fayden

                Et non, ORDER BY ne fait pas magiquement tout ce que tu souhaites.


                Le rêve de toute une vie qui se brise... :'(
                Mais bon, c'est franchement dommage quand même.

                Merci pour vos réponses en tout cas.
                • Partager sur Facebook
                • Partager sur Twitter
                MysterTy a sa mysterty-cave. Vous êtes célibataire ? Wantedlove est fait pour vous. C'est 100% gratuit !
                  21 septembre 2011 à 14:53:03

                  Citation : mysterty


                  Donc, simple curiosité, il y aurait d'autre SGBD qui permettraient de le faire ?



                  Les autres SGBD (enfin beaucoup d'autres) t'auraient indiqués que ta requête est pas valide donc tu peux presque t'estimer heureux de pas t'avoir fait insulter par le SGBD (quoique dans ce cas précis, il vaut peut être mieux se faire insulter ...)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [MySQL] Group By ordonné ?

                  × 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