Requete Group by - SQL/NoSQL - Programmation
Marsh Posté le 31-01-2005 à 15:33:41
Un "group by" sans fonction de regroupement ? Y'a une couille dans le potage là... Vire cette close immédiatement
En plus, déjà que ton DISTINCT fait tout rammer, mais en plus un GROUP BY sur une chaîne de caractères, tu cherches à endormir l'utilisateur le temps que la page se charge, spa possible
Marsh Posté le 31-01-2005 à 15:53:07
ok, mais alors je fais comment pour grouper mes posts ???
ca ne sert pas a ca group by ?
Marsh Posté le 31-01-2005 à 16:18:28
Non, ça sert pas à ça.
GROUP BY s'utilise avec des fonctions d'agregation telles que :
MAX(), MIN(), AVG() par exemple.
Pour toi, le DISTINCT fait le travail.
Par contre, essaie de faire cette requête, qui sera infiniment plus rapide :
Code :
|
Ca doit retourner ce que tu veux, et ce sera incomparablement plus rapide (et autrement plus propre)
En fait, tu récupère la date maximale et le postid maximal pour chaque couple TopicID/Titre de topic.
Si tu ajoutes l'auteur directement dans cette requête, tu auras la même info, mais pour chaque triplet TopicID/Titre de Topic/Auteur, et c'est pas ce que tu veux.
Une fois le résultat obtenu, il te faudra donc refaire une requête pour récupérer l'auteur de chaque posts retournés, à moins que ta version de MySQL supporte les sous-requêtes. Dans ce cas, la requête est légèrement plus compliquée, mais tu peux tout faire en une seule requête. Je te laisse chercher
Marsh Posté le 31-01-2005 à 16:31:19
P*tain c'etait plus simple que je ne pensais !!!
ta requete marche parfaitement ...en mettant un simplement MAX ...
arrrgggllllllll !!!!
merci, je vais en profiter pour repotasser le manuel SQL, je viens de mieux capter le fonctionnement des Group by ...
merci !!!
Marsh Posté le 21-02-2005 à 12:00:49
mmm finalement cette requete ne marche pas : le tri final ORDER BY ForumPost.PostID DESC ne se fait pas (il est fait avant le group by)
Pour bien faire il faudrait avoir deux requetes imbriquées (l'une fait regroupe par PostID, l'autre presente les resultats par PostID decroissant) :
Code :
|
malheureusement mysql ne le digere pas. J'ai aussi essayé avec des AS mais ca ne marche pas non plus. J'avais pensé utiliser une table temporaire, mais ca risque d'allonger le temps de traitement.
QQu'un voit-il une solution plus smart ?
Marsh Posté le 21-02-2005 à 12:05:01
Blackdalhia a écrit : mmm finalement cette requete ne marche pas : le tri final ORDER BY ForumPost.PostID DESC ne se fait pas (il est fait avant le group by)
|
Je suis un jeunot en SQL , mais une requete imbriquée, ce ne serait pas dans un
WHERE ... IN ( SELECT ... )
??
J'ai jamais vu ca dans un from
Marsh Posté le 21-02-2005 à 12:29:28
ben j'ai essayé ca :
Code :
|
marche pô !
Marsh Posté le 21-02-2005 à 14:28:35
déjà, vire ta foutue "*", c'estINTERDIT (par moi, et pas toute personne qui travaillera avec toi)
Sinon, dans ton sous-select, tu fais un group by sur un champ que tu ne retourne pas. Tu peux pas faire comme ça.
Deplus, le "FROM table1, table2 IN" de ta première requête ne veut rien dire.
Bref, y'a rien qui marche dans ta requête
Marsh Posté le 21-02-2005 à 14:38:34
je sais bien que ca marche pô... ce sont des essais infructueux !!!!
Les * ca sera optimisé apres, j'essaie deja de trouver une requete qui marche
Quelle est la bonne méthode ????
Marsh Posté le 21-02-2005 à 15:42:04
select tmp.postid
from
(
select max(forumpost.postid) as postid, forumtopic.titre
from forumpost, forumtopic
where forumpost.topicid = forumtopic.topicid
group by forumtopic.titre
) tmp
order by tmp.postid desc limit 0, 10
ça me semble déjà mieu.
PS: j'espère que t'as une version de MySQL très récente, parceque c'est pas supporté depuis longtemps ce type de requêtes !
Marsh Posté le 21-02-2005 à 16:55:12
ben je suis chez free, donc Mysql 4.0.22... ca marche pas ! arrrglllll !
comment on faisait avant ces versions ??
Marsh Posté le 21-02-2005 à 17:36:42
ouai je vais pas tarder
mais bon en attendant je finalise mon site.
Merci en tout cas pour ton aide Arjuna !
bon je vais essayer de trouver une solution temporaire .... je vais me chercher un tube d'aspirine ...
Marsh Posté le 21-02-2005 à 18:01:31
bah déjà, si ta requête se limite à ça, je sais pas pourquoi tu utilise une sous-requête...
select max(forumpost.postid) as postid, forumtopic.titre
from forumpost, forumtopic
where forumpost.topicid = forumtopic.topicid
group by forumtopic.titre
order 1 desc limit 0, 10
Marsh Posté le 21-02-2005 à 18:33:06
oui c'est nickel, j'avais pas pensé à designer le numero de la colonne... là ca marche !!!!! J'ai plus qu'à recupérer le nom de l'auteur du dernier post (là il me donne celui du premier post...) mais c'est déjà super !!! merci !
Marsh Posté le 21-02-2005 à 19:03:26
j'ai ajouté la requete pour l'auteur :
Code :
|
mais du coup c'est super lent ... y a pas moyen d'optimiser ce truc ?
le probleme c'est qu'avec la requete GROUP BY j'ai aucun moyen de dire quelle valeur de Auteur je veux afficher....
Marsh Posté le 21-02-2005 à 19:20:44
Ha ben là, non, et t'as en effet besoin de faire une sous-requête (bien plus complexe que celle que tu avais mis au départ)
Marsh Posté le 21-02-2005 à 20:08:16
bon ben tant pis on verra ca dans la V2 ! Encore merci Arjuna !
Marsh Posté le 31-01-2005 à 15:08:23
Bonjour,
Je developpe un forum en php, et je voudrais afficher les 10 derniers messages. Je fais donc la requete suivante :
J'obtiens bien la liste des 10 derniers enregistrements de la table ForumPost... le probleme c'est que je ne recupere pas le bon PostID quand SQL fait le regroupement: je recupere le PostID du post le plus ancien et non celui du plus recent ...
==> comment peut-on indiquer que lors du regroupement par titre, il doit prendre le PostID et l'Auteur du post le plus recent ??
merci d'avance !