Récupérer les 10 premiers articles de chaque rubrique? - Mysql

WRInaute accro
Bonjour

Je souhaiterais afficher les 10 premiers articles de chaque rubrique. Est-ce possible de le faire en une seule requête ou suis je obligé de faire une requête pour chaque rubrique (trop lourd!)? classés en fonction de la date de publication

Tables :

t_rubriques
id_rubrique
rubrique

t_articles
id_article
article
date_publication

t_art_rub
id_rubrique
id_article

Sur ma page je veux donc ceci :

RUBRIQUE 1
article 1
artcile 2
...
article 10


RUBRIQUE 2
article 1
article 2
...
article 10

Etc.


Merci d'avance pour votre aide (je n'arrive pas à trouver de solution avec les group by, having etc.).
 
WRInaute accro
et ...
comment veut- tu répondre à ce post sans savoir la structure de ta base de donnée au niveau tables?
Exemple: la même fiche est reprise sur deux tables: la première reprend titre, date création, .... et une jointure avec une autre table reprenant le contenu (un peu comme dans les logiciels de facturation): juste reprendre les 10 dernières. Dans le même exemple, un champ ID est incrémenté: on reprend simplement les 10 ID les plus haut.
 
WRInaute accro
Désolé mais j'ai pas compris ta réponse :|

J'ai pourtant donné la structure des mes tables plus haut :

Tables :

t_rubriques //table ou toutes les rubriques sont enregistrés

id_rubrique (auto incrémenté)
rubrique


t_articles //table ou tous les articles sont enregistrés

id_article (auto incrémenté)
article
date_publication //date d'ajout de l'article


t_art_rub //table qui fait la relation entre l’article et la rubrique auquel il appartient

id_rubrique
id_article

Un article est associé à une seule rubrique.

Une fois qu'on a ses éléments j'imagine (j’espère) qu'il doit bien y avoir une requête possible pour récupérer les 10 premiers articles (classés par date de publication) de chaque rubrique.

Comme indiqué également on récupère les articles en fonction de la date de publication (par ordre décroissant ou croissant peu importe je serais modifier si nécessaire) :wink:

J'arrive donc pas à comprendre quelles infos supplémentaires je peux donner :/ les 3 tables sont assez simples et la demande également (même si la requête est surement plus complexe, ou pas...). Et je pense pas qu'il soit nécessaire d'avoir plus d'info pour y répondre (je me trompe peut être)

J'ai indiqué la version simplifiée des tables car il est inutile que j'indique les champs supplémentaires (titres etc.)

pas certain également de comprendre le rapport avec le logiciel de facturation désolé :?

je veux juste pouvoir afficher les 10 premiers articles des X rubriques du site sur ma page ceci en essyant d'éviter de faire X requetes

Je pourrais très bien faire une boucle sur ce type de requêtes X fois (x = le nombre de rubriques), mais j'ose espérer que l'on peut faire ça avec une seule requête.

Code:
SELECT article FROM t_article A, t_art_rub AR WHERE A.id_article=AR.id_article AND id_rubrique=$id_rubrique order by A.date_publication LIMITE 0,10
 
WRInaute accro
J'ai essayé chez moi avec une requête imbriqué dans une autre (la première parse les rubriques, celle imbriqué les articles) mais la sélection des id d'article que je faisait sur une clause where (idarticle IN (select id from tablearticle where idrubrique = idrub order by date limit 0,10)) renvoie une erreur en me disant que je ne peut pas utiliser de LIMIT dans la requête imbriquée avec IN
 
Nouveau WRInaute
une requête pour chaque rubrique (trop lourd!)
Trop lourd en quoi ? Temps de réponses ? Ressources ? ou à coder ?
Moi les requetes de 3 kms j'évite si ma base n'est pas bien structurée et (dans le cas de MySQL) si je ne suis pas en InnoDB avec des contraintes nombreuses et en béton. N'oublions pas que MySQL ne se contente pas d'éxecuter les requêtes mais s'appuie sur la structure pour faciliter leur exécution.
De plus, si c'est 'trop lourd' en temps de réponses, pense à faire un cache avec un cron qui le rafraichit..
Je ne pense pas que le résultat de ta requête change toutes les 10 secondes non ?
 
WRInaute accro
@zeb :

J'aurais plus pensé que cette problématique pouvait être réglée avec un group by (ou having) ou un truc dans le genre.
je suis persuadé qu'il doit y avoir une solution avec une requête assez simple, mais j'arrive pas à trouver :/

Genre on groupe par rubrique, mais j'ai pas réussi.

par contre dans ta solution en enlevant le limit tu affiches bien tous les articles de chaque rubriques? la par contre j'imagine que le temps de réponse explose d'autant plus qu'il y a une requête imbriquée.

@puretentation :

trop lourd dans la mesure ou je souhaites limiter le nombre de hits (requêtes, appel d'images, include etc.)
certes je pourrais mettre la page en cache pour limiter ainsi le nombre de requête dans la journée.

Faire une requête par rubrique ne serait pas forcément trop lourd en temps de réponse, mais si on a une dizaine de requête juste pour ça (en plus des autres requêtes pour d'autres éléments sur la page) je trouve ça pas terrible, mais ça reste un avis personnel. J'aime ne pas dépasser les 5-10 requêtes pour une page.

Si vraiment j'ai pas le choix je ferais de cette façon, mais j'aimerais pouvoir être certain d'avoir étudié d'autres choix possibles, dont celui de pouvoir gérer ça avec une seule requête. ça doit quand même être faisable, ensuite je pourrais comparer sur les temps de réponses etc. :wink:

la structure de ma base et de mes tables est suffisamment simple pour ne pas être un problème pour ces requêtes. Suffit de voir les tables que j'ai indiqué pour comprendre que la structure est simple. :mrgreen:

PS : je ne suis pas en innodb

Basons nous sur 10 000 articles et 8 rubriques.
 
WRInaute accro
noren a dit:
par contre dans ta solution en enlevant le limit tu affiches bien tous les articles de chaque rubriques? la par contre j'imagine que le temps de réponse explose d'autant plus qu'il y a une requête imbriquée.
oui j'ai bien les articles de chaque rubrique mais pas limités en nombre. Sinon oui ça deviens gourmand si je fais ça sur le domaine principal car 40 000 rubriques et des 100aine de milliers d'articles (bref j'ai testé sur un petit sous domaine qui a la même structure)
 
WRInaute accro
Merci pour ton test :wink:

Dans mon cas les rubriques devraient pas dépasser 10-15 et les articles 100 000 mais dans quelques années lol
Mais au moins t'as un test concluant.

mais si on ajoute a cela que je souhaites récupérer que 10 articles de chaque rubriques ça devrait être encore moins gourmand encore faudrait-il pouvoir caler ce fichu LIMIT :)

Si quelqu'un à une solution je suis toujours preneur :mrgreen:
 
WRInaute accro
Je me permet de remonter ce post, car ma question est toujours d'actualité

Donc si un pro de mysql passe par là :mrgreen:
 
WRInaute passionné
Je pense que l'utilisation de CURSOR permet d'itérer à travers les résultats d'une première requète et d'en effectuer une seconde. Voir ici.
 
WRInaute accro
Ah, je ne connaissait absolument pas les curseurs.

Merci pour cette piste que je vais étudier. Si d'autres ont une solution qui pourrait paraitre plus simple qu'ils n'hésitent pas. :wink:
 
Discussions similaires
Haut