Jump to content
Sign in to follow this  
Compte supprimé

[pour les pros] problème de selection mysql

Rate this topic

Recommended Posts

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

Share this post


Link to post
Share on other 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 :)

Share this post


Link to post
Share on other 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]

Share this post


Link to post
Share on other sites

Chaque fois qu'il y a un Re dans le head ?

Je ne vois pas trop, là. Où est le Re ? .. :(

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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,

Edited by jeroen

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...