У меня есть таблица с именем "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-совместимое решение, я был бы благодарен:)