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".
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.
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 ! ^^
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 ;)
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 !!!