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 !
MysterTy a sa mysterty-cave. Vous êtes célibataire ? Wantedlove est fait pour vous. C'est 100% gratuit !
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)
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));
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 ?
MysterTy a sa mysterty-cave. Vous êtes célibataire ? Wantedlove est fait pour vous. C'est 100% gratuit !
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 ...)
[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.