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
Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top