Aller au contenu

[pour les pros] problème de selection mysql


Compte supprimé

Sujets conseillés

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

Lien vers le commentaire
Partager sur d’autres sites

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 :)

Lien vers le commentaire
Partager sur d’autres sites

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]

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 f2
HAVING f1.id = f2.thread
GROUP BY f2.thread
ORDER BY f2.last
DESC LIMIT 15";

Anonymus.

Lien vers le commentaire
Partager sur d’autres sites

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.auteur
FROM forum as f1,forum as f2
WHERE f1.id = f2.thread
GROUP BY f2.thread
ORDER BY f2.last
DESC LIMIT 15";

Merci encore,

Cordialement,

Modifié par jeroen
Lien vers le commentaire
Partager sur d’autres sites

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 :P

Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...