Рефакторинг подзапросов с использованием GROUP BY / HAVING? - PullRequest
0 голосов
/ 04 февраля 2009

Я строю запрос MySQL, чтобы определить, сколько элементов из каждой из нескольких категорий появятся в заданном диапазоне дат. Моя первая попытка выглядела так:

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

Таблица довольно большая, и я хотел бы реорганизовать запрос, чтобы ускорить его, но я не уверен, каким образом - это можно переписать с помощью операторов GROUP BY / HAVING или есть другой способ, который я пропускаю?

Редактировать : пример набора результатов - примерно так:

Title | Category 1 Total | Category 2 Total | Unknown Category Total
ABC     1                  3                  0
DEF     2                  7                  2

Ответы [ 3 ]

3 голосов
/ 04 февраля 2009
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

Вы можете вставить выражения в функции sum (): истина равна 1, ложь равна 0. Также я использовал оператор BETWEEN, который немного быстрее.

Альтернатива, которая будет возвращать другой формат результата, но концептуально немного проще:

select Title, CategoryID, count(*)
from entries
WHERE Date BETWEEN @StartDate AND @EndDate
group by Title, CategoryID
0 голосов
/ 04 февраля 2009

Как насчет группировки по идентификатору категории, а затем с помощью оператора Имея, чтобы отфильтровать определенные категории, например:

select CategoryID, count(*) 
from entries 
where Date >= @StartDate AND Date <= @EndDate
group by CategoryID
having CategoryID = 1 or CategoryID = 2 or CategoryID is null

Если в категории несколько заголовков, вы можете сгруппировать их по обоим полям:

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
0 голосов
/ 04 февраля 2009
Select COUNT(*), sTitle, CategoryID FROM entries 
WHERE Date >= @StartDate and Date <= @EndDate 
GROUP BY CategoryID, sTitle
...