Compte supprimé Posté 25 Novembre 2004 Posté 25 Novembre 2004 Bonjour à tous, J'ai un pb de selection dans une base mysql via php : ma table "forum" contient les post du forum, ses champs sont les suivants : id -> numéro du post thread -> numéro du thread (est egal à l'id du premier post du thread) date -> date du post head -> sujet du post body -> corps du post auteur -> auteur du post Je cherche à selectionner les 15 derniers threads, avec pour chaque thread : - le numero du thread - l'auteur du premier post - le head du premier post - la date du dernier post - le nombre de posts pour le thread Pour l'instant je fais : "SELECT thread,count(id) as cnt,max(date) as last,head,auteur FROM forum GROUP BY thread ORDER BY last DESC LIMIT 15"; Tout va super bien à un détail pres : A peu pres pour un thread sur 30 (mais toujours pour les mêmes threads), ce n'est ni ll'auteur, ni le head du premier post qui est selectionné mais un autre. Voir sur la page http://www.skitour.fr/forum/ (chaque fois qu'il y a un re: dans le head) Merci de votre aide
Titag Posté 25 Novembre 2004 Posté 25 Novembre 2004 Si j'ai bien compris la structure de ta table, dans un premier temps, pour éviter de se retrouver avec des post qui ne sont pas à l'origine d'un thread, je mettrais une condition dans ma requète : WHERE thread=id Ensuite, il est facile de récupérer le sujet, l'auteur, etc... Par contre, ca pose une difficulté pour compter le nombre de post de chaque thread. Tu peux peut-être faire une requete supplémentaire ? Mais je ne suis pas sur que ce soit la bonne solution non plus
Compte supprimé Posté 25 Novembre 2004 Auteur Posté 25 Novembre 2004 C'est effectivement une solution, mais il me faudrait 2 requètes... Je préfère éviter (si j'ai le choix..) Ce que je ne comprends pas, c'est que ça marche tres bien dans 97% des cas...
Titag Posté 25 Novembre 2004 Posté 25 Novembre 2004 Hypothèse : ce n'est peut-etre pas cette requète qui est à l'origine de ce bug, mais plutôt en aval ( ), à l'insertion dans la base... Pourquoi ? Mystère pour le moment mais je te suggère tout de même de jeter un oeil de ce coté. [HS] Sinon, je viens de faire un tour sur ton site : bravo ! Ca manque un peu de photos des pyrénées mais c'est quand même un super site. [/HS]
Anonymus Posté 25 Novembre 2004 Posté 25 Novembre 2004 Chaque fois qu'il y a un Re dans le head ? Je ne vois pas trop, là. Où est le Re ? ..
Compte supprimé Posté 25 Novembre 2004 Auteur Posté 25 Novembre 2004 Comprends pas comment ça peut être en amont [HS] Merci ! N'hésites pas à le faire un Bl [HS]
Compte supprimé Posté 25 Novembre 2004 Auteur Posté 25 Novembre 2004 Chaque fois qu'il y a un Re dans le head ? Je ne vois pas trop, là. Où est le Re ? .. <{POST_SNAPBACK}> Chaque fois qu'il y a un Re dans le head du thread, c'est la que ça a planté : ca n'a pas selectionné la première ligne lors du regroupement.. exemple Re: poids des skis..... Vous avez une idée ?
Anonymus Posté 25 Novembre 2004 Posté 25 Novembre 2004 Il n'y a pas de lien entre le thread du premier post, et le thread de la réponse. Il devrait y avoir une 'jointure' entre les 2 tables. Dans ton cas, les 2 tables sont les mêmes, c'est une particularité, mais ca ne change pas le problème. il manque apparemment la jointure; J'aurais plutot vu une clause telle que : "SELECT thread,count(id) as cnt,max(date) as last,head,auteur FROM forum WHERE thread=id OR thread=?? GROUP BY thread ORDER BY last DESC LIMIT 15"; Remplacer les ?? par 0 ou Null en fonction de ton choix. Anonymus.
Compte supprimé Posté 25 Novembre 2004 Auteur Posté 25 Novembre 2004 Sauf qu'en faisant ça j'ai plus besoin de 'GROUP BY' et que je perd le nombre de réponses au thread (cnt) et la date de dernière réponse (latest)
Anonymus Posté 25 Novembre 2004 Posté 25 Novembre 2004 En fait, il faut penser sa table comme 2 tables. Dans le FROM, il faut que tu décomposes les 2 ainsi : FROM forum as f1,forum as f2 puis tu fais : WHERE f2.thread=f1.id pour la requète de jointure, et dans le SELECT tu choisis exactement les champs que tu veux : SELECT f2.auteur,f1.thread dans le ORDER BY : Il faut que tu mettes ORDER BY f1.id Quand on utilise un ORDER BY, il faut utiliser HAVING. Donc, on recommence la requète.. Ca devrait donner à peu près ceci : "SELECT f2.thread,count(f1.id) as cnt,max(f2.date) as last,f1head,f2.auteur FROM forum f1,forum f2HAVING f1.id = f2.threadGROUP BY f2.threadORDER BY f2.last DESC LIMIT 15"; Anonymus.
Compte supprimé Posté 25 Novembre 2004 Auteur Posté 25 Novembre 2004 (modifié) Je teste, merci ! [EDIT] Ok, j'ai réussi à me dépatouiller. Ca ne marchait pas avec HAVING (qui va normalement APRES le GROUP BY), j'ai finalement fait : "SELECT f2.thread,count(f2.id) as cnt,max(f2.date) as last, f1head, f1.auteurFROM forum as f1,forum as f2WHERE f1.id = f2.threadGROUP BY f2.threadORDER BY f2.lastDESC LIMIT 15"; Merci encore, Cordialement, Modifié 25 Novembre 2004 par jeroen
Titag Posté 26 Novembre 2004 Posté 26 Novembre 2004 Hypothèse : ce n'est peut-etre pas cette requète qui est à l'origine de ce bug, mais plutôt en aval ( ), à l'insertion dans la base... Il va de soit que je voulais dire en amont
maximettb Posté 28 Novembre 2004 Posté 28 Novembre 2004 HAVING ne sert qu'à rajouter des conditions après l'éxécution du GROUP BY. Par contre, il faut bien faire attention aux temps d'éxécution des requètes et surtout du nombre de visiteurs que tu vises sur ton forum. Parfois, il vaut mieux répéter de l'information sur plusieurs tables plutôt que de faire des jointures plutôt couteuses... C'est ce que font tous les forums du style invision, phpbb et consort. Il faut bien y réfléchir...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant