contexte : 2 tables jointes,
table_produits (id_produit (PK), id_categorie (FK), nom_produit)
table_categories (id_categorie (PK), nom_categorie)
On cherche à lister les catégories et pour chaque catégorie, récupérer le nombre de produits pour afficher, par exemple:
- categorie 1 (2 produits)
- categorie 2 (12 produits)
- categorie 3 (0 produits)...
Mauvaise méthode
1 première requête de type
SELECT * FROM table_produits
on récupère l'id produit de chaque résultat (que l'on appellera par exemple id_res), et on fait une seconde requête de type
SELECT COUNT(*) FROM table_categorie WHERE id_produit=id_res.
Cette méthode fonctionne très bien. Seul inconvénient, on envoie une requête pour chaque produit. ce qui fait pour n produits n+1 requêtes.
Bonne méthode
On utilise le COUNT SQL avec la jointure
La requête est de type
SELECT table_categories.nom_categorie, COUNT(table_produits.id_produit) AS nombre_categories FROM table_categories LEFT JOIN table_produits ON table_categories.id_categorie=table_produits.id_categorie GROUP BY table_categories.id_categorie
La requête est un peu longue à écrire (il faut lister les champs que l'on veut récupérer, on ne peut pas mélanger * et COUNT(*)) mais on passe de n+1 requêtes à 1 requête (ce qui n'est pas négligeable avec n très grand)