Refactoriser GROUP BY en utilisant les sous-requêtes / AYANT?
-
21-08-2019 - |
Question
Je construis une requête MySQL pour déterminer le nombre d'éléments de chacune de plusieurs catégories apparaissent dans une période donnée. Ma première tentative ressemblait à ceci:
select Title,
(select count(*) from entries where CategoryID=1
and Date >= @StartDate and Date <= @EndDate) as Cat1,
(select count(*) from entries where CategoryID=2
and Date >= @StartDate and Date <= @EndDate) as Cat2,
(select count(*) from entries where CategoryID is null
and Date >= @StartDate and Date <= @EndDate) as UnkownCategory
from entries
where Date >= @StartDate and Date <= @EndDate
Le tableau est assez grand et je voudrais factoriser la requête pour accélérer, mais je ne sais pas comment - cela peut être réécrite en utilisant GROUP BY / déclarations ou est-il PRESENTANT une autre façon que je suis absent?
Modifier : ensemble de l'échantillon de résultat - quelque chose comme ceci:
Title | Category 1 Total | Category 2 Total | Unknown Category Total
ABC 1 3 0
DEF 2 7 2
La solution
select Title, SUM(CategoryID=1) as Cat1, SUM(categoryID=2) as Cat2,
SUM(categoryID IS NULL) as UnknownCategory
FROM entries
WHERE Date BETWEEN @StartDate AND @EndDate
GROUP BY Title
Vous pouvez coller des expressions dans les fonctions (somme):. Vérité est égal à 1, faux égal à 0. Aussi j'utilisé l'opérateur BETWEEN qui est un peu plus rapide
Une alternative qui renvoie une autre mise en page de résultat, mais est un peu plus simple sur le plan conceptuel:
select Title, CategoryID, count(*)
from entries
WHERE Date BETWEEN @StartDate AND @EndDate
group by Title, CategoryID
Autres conseils
Que diriez-vous de regroupement par catégorie id puis en utilisant l'instruction ayant pour filtrer les catégories spécifiques, comme:
select CategoryID, count(*)
from entries
where Date >= @StartDate AND Date <= @EndDate
group by CategoryID
having CategoryID = 1 or CategoryID = 2 or CategoryID is null
S'il y a plusieurs titres par catégorie, vous pouvez grouper par les deux champs:
select Title, CategoryID, count(*)
from entries
where Date >= @StartDate AND Date <= @EndDate
group by Title, CategoryID
having CategoryID = 1 or CategoryID = 2 or CategoryID is null
Select COUNT(*), sTitle, CategoryID FROM entries
WHERE Date >= @StartDate and Date <= @EndDate
GROUP BY CategoryID, sTitle