requête SQL complexe
4 messages
• Page 1 sur 1
Consultez la formation au REFERENCEMENT naturel Google de WebRankInfo / Ranking Metrics
- jeroen
- WRInaute passionné

- Messages: 2455
- Inscription: 30 Aoû 2002
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: 30 Oct 2005
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
- jeroen
- WRInaute passionné

- Messages: 2455
- Inscription: 30 Aoû 2002
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 REFERENCEMENT 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 :
- Requete sql complexe en php
- Requete SQL : double tri un peu complexe
- Mysql Requête comparative complexe
- PB php/sql insert formulaire complexe
- [PHP] Webservice SOAP - Requête XML et type complexe ?
- Requête mysql : Tri complexe des commentaires par votes
- Requête SQL ?
- requête sql help!!
- [sql] Requête
- pb de requête sql
- Google API : guide de développement de l'API Google - 20-09-2002
- AdSense Tracking : statistiques détaillées sur les clics AdSense - 29-02-2004
- l'URL Rewriting expliqué aux débutants - 13-06-2003
- Nombre moyen de mots par requête : statistiques AOL Août 2006 - 10-08-2006
- Nombre de clics dans les pages de résultats : statistiques AOL Août 2006 - 11-08-2006
- Informations sur l'infrastructure technique de Google - 01-11-2004
- Gestion des langues et des sessions en PHP / MySQL - 02-05-2004
- Google indexe le Flash - 28-04-2004
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

