requête SQL complexe

WRInaute passionné
Salut à tous. J'ai un problème SQL un peu complexe.

J'affiche sur ma home la liste des 15 derniers messages du forum, avec le nombre de réponses associées.

Ma table forum est construite comme ça :
- id
- thread (id du premier message)
- titre
- date

Pour l'instant je fait une jointure sur la même table, cette requête marche trés bien, mais comme la table forum commence à grossir la requête commence à être longue.

Code:
SELECT f1.titre, f2.thread, count(f2.id) as cnt, max(f2.date) as last, max(f2.id) as last_id
FROM forum as f1, forum as f2
WHERE f1.id=f2.thread
GROUP BY f2.thread ORDER BY last DESC LIMIT 15

Je suis certain qu'il y a une autre méthode. Vous avez une idée ??

A noter que j'ai mis des index sur les champs thread et id

Merci
 
Nouveau WRInaute
Bonjour,

Quand un modèle de données ne correspond pas question performances, on a le droit de le "casser" (cf cours sur formes normales) pour améliorer en dupliquant un peu d'information. C'est tout à fait admis.

Donc là je dirais d'ajouter un simple trigger (ou dans le code php un insert de plus) qui stocke en permanence les 15 derniers messages dans une table à part (et qui vire le 16eme) et ton "select" devient

Code:
Select message from table_last_messages order by mydate

Bye
 
WRInaute impliqué
Déjà tu peux enlever les "as" qui ne servent à rien.
Une question: peux tu décrire plus précisément tes tables ?
f1 contient les id,titres et f2 les réponses, c'est ça ?
 
WRInaute passionné
si si, les as servent.

les reponses sont sur la même table

f1 et f2 sont 2 alias de la table forum. c'est la seule solution que j'ai trouvé pour que le group by se passe correctement. SI je ne fait pas ça, l'alternative suivante (classique) n'est pas satisfaisante :

imagine 3 lignes

id | thread | titre | date
1 | 1 | premier thread | date1
2 | 2 | deuxieme thread | date 2
3 | 1 | re: premier thread | date 3

pour selectionner le thread ayant eu la dernière réponse, je peux faire :
Code:
SELECT min(id) as id, thread, titre, count(id) as cnt, max(date) as last
FROM forum
GROUP BY thread ORDER BY last DESC LIMIT 1


Lors du regroupement suivant :

1 | 1 | premier thread | date1
3 | 1 | re: premier thread | date 3

il ne sait pas quel titre prendre, car par de "min" ni de "max":
min(id) ok > 1
max(date) ok > date3
mais titre ??

donc je me retrouve avec des titres qui ne correspondent pas...

j'ai testé des temps , hier j'étais à 0.8s pour la requête, aujourd'hui je tombe à moins 1/1000 de secondes. Je suppose donc que la requête est trés ben optimisée, et que le serveur sql à du mal de temps en temps...
 
Discussions similaires
Haut