Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL :sélection du nombre de plusieurs tables

Le problème est mathématique avec des valeurs nulles et un ordre avec des valeurs nulles (vérifiez l'option "NULLS LAST" pour remplacer l'ordre par défaut qui renvoie les valeurs nulles en premier pour un ordre décroissant).

Dans votre cas, avec les jointures externes, si l'utilisateur a une tonne de commentaires d'articles mais pas de commentaires de forum, eh bien, 100 + null =null dans les mathématiques Oracle. Donc, pour que les calculs fonctionnent, vous devez faire null =0. C'est là qu'intervient NVL() (et a également le joli effet secondaire d'éliminer les nuls embêtants de votre jeu de résultats) !

SELECT u.id, u.username, (NVL(COUNT(a.id),0) + NVL(COUNT(f.id),0)) AS rank 
FROM site_users u 
  LEFT JOIN site_articles_comments a ON a.user_id = u.id 
  LEFT JOIN site_forum_comments f ON f.user_id = u.id 
GROUP BY u.username, u.id ORDER BY rank DESC LIMIT :l

Je vois que vous avez à la fois MySQL et Oracle dans vos balises - ce qui précède concerne Oracle. Si pour MYSQL, utilisez COALESCE(COUNT(),0) à la place.