Bonjour,

Voila je rencontre un petit problème avec ma reflexion lol.
J'aimerais faire un Top 10 d'une liste en fonction des commentaires.

C'est à dire, si un article a 1 commentaire et que les 9 autre on n'ont 0 celui qui aura le plus commentaire sera en tête de liste et les 9 autre se suivront en fonction de la date de publication par exemple.

pour cela j'ai 2 table une table "article" et une "commentaire".

Ma réfléxion !!

Pour moi il faudrait prendre les commentaire en fonction des articles et la ou je bloque c'est comment je faire pour dire que celui qui a le plus de commentaire sera 1er.

Mon code !!

Pour le moment j'ai uniquement une petite requete qui n'est peu etre pas la bonne ! lol

SELECT * FROM ck_receipts_comment
LEFT JOIN ck_receipts ON receipts_id = receipts_comment_receipts
WHERE receipts_comment_receipts = ?
LIMIT 10

Merci d'avance pour votre aide et réfléxion qui pourrais peu être corriger la mienne ! ^^

3 réponses


AlexJM
Réponse acceptée

Je vais t'aider à la créer étape par étape, par contre ma tables des articles se nomme posts et ma table des commentaires se nomme comments, je te laisserai changer. De plus, ma clé étrangère (celle qui permet de lier des commentaires à un post) dans la table comments se nomme post_id et la date à laquelle on poste un article et un commentaire se nomment created_at

Alors on commence par sélectionner des articles

SELECT * FROM posts

Ensuite, on va faire une autre requête pour compter les commentaires par articles ainsi que pour récupérer la date du dernier article

SELECT comments.post_id, COUNT(*) count_comments, MAX(comments.created_at) last_comment FROM comments GROUP BY comments.post_id

Maintenant, on va faire une liaison entre les 2

SELECT * FROM posts LEFT JOIN (SELECT comments.post_id, COUNT(*) count_comments, MAX(comments.created_at) last_comment FROM comments GROUP BY comments.post_id) T2 ON T2.post_id = posts.id

Il reste plus qu'à trier et à faire la limite

SELECT * FROM posts LEFT JOIN (SELECT comments.post_id, COUNT(*) count_comments, MAX(comments.created_at) last_comment FROM comments GROUP BY comments.post_id) T2 ON T2.post_id = posts.id ORDER BY T2.count_comments DESC, T2.last_comment DESC, posts.created_at DESC LIMIT 10

Voilà, dans l'ordre tu auras :
D'abord ceux qui ont le plus de commentaires,
Si 2 articles ont le même nombre de commentaires (et plus que 0), ce sera trié par la date du dernier commentaire
Si certains articles ont 0 commentaires, ils seront triés par la date où ils ont été postés

Maintenant, si tu veux vraiment faire un classement, avec une place, tu peux ajouter ceci:

SELECT T.*, @counter := @counter + 1 place FROM (SELECT * FROM posts LEFT JOIN (SELECT comments.post_id, COUNT(*) count_comments, MAX(comments.created_at) last_comment FROM comments GROUP BY comments.post_id) T2 ON T2.post_id = posts.id ORDER BY T2.count_comments DESC, T2.last_comment DESC, posts.created_at DESC LIMIT 10) T CROSS JOIN (SELECT @counter := 0) c

Si tu as des questions, n'hésite pas ;)

PS: ce genre de questions aurait plutôt leur place dans la catégorie mysql ;)

Alexe
Auteur

Impec sa marche niquel j'ai du modifier quelque petit chose pour l'adapter ! =P

Mais aussi non sa fait ce que je souhaitais ! merci !!!

Pas de prob ;)