【发布时间】:2011-09-15 01:29:53
【问题描述】:
我有一个名为“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
这会再进行 2 个子查询,但我想你明白了。
有没有更简单的方法来收集这些数据,因为它基本上是来自工作表的同一数据子集的 5 个不同的 COUNT?
数据的子集是'creator_id = 5',之后每个计数基本上只是1-2个附加条件。请注意,现在我们正在使用 Postgres,但在不久的将来可能会迁移到 MySQL。所以如果你能提供一个 ANSI 兼容的解决方案,我会很感激 :)
【问题讨论】:
-
您可以创建一个子查询或加入一个新表,将所有内容分成 3 个组,然后对组执行 COUNT / GROUP BY。
标签: sql query-optimization subquery