requête SQL complexe
4 messages • Page 1 sur 1
Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics
requête SQL complexe
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.
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
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: Tout sélectionner
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
-

la maitresse - Nouveau WRInaute
- Messages: 4
- Inscription: Dim Oct 30, 2005 15:27
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
Bye
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: Tout sélectionner
Select message from table_last_messages order by mydate
Bye
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 :
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...
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: Tout sélectionner
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...
4 messages • Page 1 sur 1
Formation recommandée sur ce thème :
Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- AdSense Tracking : statistiques détaillées sur les clics AdSense
- l'URL Rewriting expliqué aux débutants
- Gestion des langues et des sessions en PHP / MySQL
- Statistiques des requêtes sur les moteurs en 2006
- Google facilite les recherches par site
- Nouvelle interface des pages de Google
- Nombre moyen de mots par requête : statistiques AOL Août 2006
- Yahoo France propose des requêtes avec les recherches suggérées
- Le marketing viral au service du référencement
- Suggestions de requêtes dans Google News
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités




le forum