Plusieurs COUNT() dans une seule requête SQL

Lors du développement d’un site ou d’une application il est fort probable de devoir compter certaines informations avec COUNT(). Par exemple un site web communautaire peut compter le nombre de nouveaux messages et le nombre de notifications lorsque l’utilisateur se connecte. Cet article explique comment et pourquoi il faut effectuer une seule requête pour tous les COUNT().

Intérêt

Effectuer plusieurs appels dans une base de données est relativement long. Dans la mesure du possible il faut réduire les appels. Dès lors, pour de meilleurs performances il convient d’éviter d’effectuer ces 3 requêtes suscessivements :

SELECT COUNT(*) FROM table1;
SELECT COUNT(*) FROM table2;
SELECT COUNT(*) FROM table2 WHERE is_valid = 1;

Syntaxe pour grouper plusieurs requêtes en une seule

Les 3 requêtes présentées ci-dessous peuvent être regrouper en 1 seule en utilisant la syntaxe suivante:

SELECT
(SELECT COUNT(*) FROM table1) as count1,
(SELECT COUNT(*) FROM table2) as count2,
(SELECT COUNT(*) FROM table2 WHERE is_valid = 1) as count3

Cette requête va retourner un enregistrement contenant les valeurs count1, count2 et count3.

Utilité

Voici une petite liste non-exhaustive de toutes les fonctionnalités qui peuvent être comptées au sein de cette unique requête SQL :

  • Compter le nombre de membre inscrit
  • Compter le nombre de membres connectés
  • Compter le nombre de visiteurs connectés
  • Compter les nouveaux messages non-lu d’un membre
  • Compter le nombre de notification pour un membre

Aller plus loin

Pour aller un peu plus et réduire la charge serveur il est aussi possible de mettre en cache ces valeurs. Mais cela ne reflète plus de SQL mais du reste de l’application.

Ce contenu a été publié dans Bonnes pratiques.

A propos de l'auteur : Tony Archambeau

Fort de plusieurs années d’expérience dans le développement web, Tony partage ses connaissances sur des projets divers dont le site infowebmaster.fr.
Il est possible de le suivre sur Twitter.

Partager

3 réflexions au sujet de « Plusieurs COUNT() dans une seule requête SQL »

  1. thevince55 dit :

    Le regroupement no fonctionne pas chez moi il demande la clause FROM pour le 1er select

  2. Luc Robath dit :

    j’ai trouvé ce dont j’ai besoin, juste un remerciement sincère et chaleureux!
    merci !!!

  3. ozelian dit :

    Merci beaucoup. J’ai tenté un bon nombre de syntaxes qui ne donnaient pas le résultat espéré, la vôtre a fonctionné immédiatement :-)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *