J'ai une page où je dois pouvoir trier mes résultats.
Cette page liste les articles de mon site.
Les informations concernant ces articles sont dans une table "blog".
En revanche, les informations liées à leurs commentaires sont dans une table "commentaires", et celles liées à leurs appréciations sont dans une table "like_dislike".
Pour obtenir le nombre de commentaires, je dois faire une requête du type :
SELECT COUNT (*) AS nb_comm FROM commentaires WHERE article=:article
Et pour obtenir le nombre de likes, je dois faire :
SELECT COUNT (*) AS nb_likes FROM like_dislike WHERE like=true AND article=:article
Donc pour afficher les résultats ça va, même si je sais que c'est pas optimisé (je fais ces 2 dernières requêtes dans la boucle qui affiche les résultats de la requête sur "blog"...).
Mais quand il s'agit de trier les résultats en fonction du nombre de commentaires ou de likes, c'est une autre histoire...
J'ai beaucoup de mal à faire une requête SQL dès que ça sort d'une utilisation courante, donc je suis un peu perdu là.
J'ai imaginé faire ça :
SELECT *, (SELECT COUNT (*) AS nb_comm FROM commentaires WHERE article=:article) FROM blog ORDER BY nb_comm DESC
Soit tu mets des colonnes nb_comm et nb_like dans ta table articles, mises à jour par trigger sur les tables de commentaires et de like... c'est valable si tes tables sont grosses et que le comptage des comms/likes est lent.
Soit tu fais ça :
SELECT a.*, count(c.article_id) AS nb_comms
FROM articles a
LEFT JOIN commentaires c USING (article_id)
GROUP BY article_id
ORDER BY count(c.article_id) DESC
Ça utilise le GROUP BY non-standard de MySQL.
N'oublie par l'index sur commentaires( article_id, commentaire_id ), et le même sur la table de like.
[SQL]Requête imbriquée avec SELECT COUNT
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Tutoriel complet MySQL !