Выбор COUNT из разных критериев в таблице

у меня есть таблица с именем «jobs». Для конкретного пользователя задание может быть активным, заархивированным, просроченным, ожидающим или закрытым. Прямо сейчас каждый запрос страницы генерирует 5 запросов COUNT, и в попытке оптимизации я пытаюсь свести это к одному запросу. Это то, что у меня есть до сих пор, но это немногим быстрее, чем 5 отдельных запросов. Обратите внимание, что я упростил условия для каждого подзапроса, чтобы его было легче понять, однако полный запрос действует одинаково.

Есть ли способ получить эти 5 счетчиков в одном запросе без использования неэффективных подзапросов?

SELECT
  (SELECT count(*)
    FROM "jobs"
    WHERE
      jobs.creator_id = 5 AND
      jobs.status_id NOT IN (8,3,11) /* 8,3,11 being 'inactive' related statuses */
  ) AS active_count, 
  (SELECT count(*)
    FROM "jobs"
    WHERE
      jobs.creator_id = 5 AND
      jobs.due_date < '2011-06-14' AND
      jobs.status_id NOT IN(8,11,5,3) /* Grabs the overdue active jobs
                                      ('5' means completed successfully) */
  ) AS overdue_count,
  (SELECT count(*)
    FROM "jobs"
    WHERE
      jobs.creator_id = 5 AND
      jobs.due_date BETWEEN '2011-06-14' AND '2011-06-15 06:00:00.000000'
  ) AS due_today_count

] Это касается еще двух подзапросов, но я думаю, вы уловили идею.

Есть ли более простой способ собрать эти данные, поскольку в основном это 5 разных COUNT из одного и того же подмножества данных из таблицы заданий?

подмножество данных - creator_id = 5, после этого каждый счет представляет собой всего 1-2 дополнительных условия. Обратите внимание, что сейчас мы используем Postgres, но, возможно, в ближайшем будущем перейдем на MySQL. Так что, если вы можете предоставить ANSI-совместимое решение, я был бы признателен :)

17
задан nzifnab 14 June 2011 в 21:05
поделиться