MySQL : Récupérer efficacement plusieurs agrégations de sommes avec le filtrage conditionnel
Travailler avec des bases de données nécessite souvent de récupérer plusieurs ensembles de données en fonction de conditions variables. Cela peut être particulièrement complexe lorsqu'il s'agit de différentes valeurs de champ au sein d'une même requête.
Le défi :
Considérons un tableau transactions
avec les colonnes id
, account_id
, budget_id
, points
et type
. Le but est de récupérer, en une seule requête, la somme de points
pour chaque budget_id
où type
est égal à « allocation », et séparément, la somme de points
où type
est égal à « problème ».
La solution : tirer parti de la IF()
fonction de MySQL
La fonction IF()
de MySQL fournit une solution concise. Nous pouvons l'utiliser au sein d'un SUM()
agrégat, combiné avec GROUP BY
, pour obtenir le résultat souhaité :
<code class="language-sql">SELECT budget_id, SUM(IF(type = 'allocation', points, 0)) AS allocated, SUM(IF(type = 'issue', points, 0)) AS issued FROM transactions GROUP BY budget_id;</code>
Répartition des requêtes :
IF(type = 'allocation', points, 0)
: Cette expression conditionnelle vérifie chaque ligne. Si type
est « allocation », il renvoie la valeur points
; sinon, il renvoie 0.IF(type = 'issue', points, 0)
: Cela reflète ce qui précède, mais pour type
= 'problème'.SUM(...)
: La fonction SUM()
calcule le total pour chaque expression conditionnelle, additionnant efficacement les points séparément pour les types « allocation » et « problème ».GROUP BY budget_id
: Cela regroupe les résultats par budget_id
, fournissant les sommes agrégées pour chaque budget.Exemple illustratif :
La requête, lorsqu'elle est exécutée sur la table transactions
, peut produire un ensemble de résultats comme celui-ci :
<code>budget_id | allocated | issued ----------|-----------|-------- 434 | 200000 | 100 242 | 100000 | 5020 621 | 45000 | 3940</code>
Cela démontre la récupération efficace de plusieurs ensembles de données agrégées avec un filtrage conditionnel distinct au sein d'une seule requête MySQL optimisée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!