我有一个 SQL 查询(在 MySQL 中),它选择一个总数以及有多少已完成任务的计数:
SELECT
count(*) as total, IF(SUM(NOT `completed`) IS NULL,0,SUM(NOT `completed`)) as incomplete
FROM
tasks
表格可以做成这样:
CREATE TABLE `tasks` (
`clave` int(11) NOT NULL AUTO_INCREMENT,
`completed` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'If it is 0 isn\'t completed, otherwise is completed',
PRIMARY KEY (`clave`)
) ENGINE=InnoDB;
您可以观察到,在查询中我使用了两次 SUM(NOT completed)
,一次是检查它是否会返回 null(并返回 0),一次是返回计数(当它不为空)。 SUM()
函数返回 null
如果表(或查询)为空,即表根本没有行。
由于您尝试求和两次,我认为 MySQL 会计算两次总和。
我已经测试过是否可以为该列设置一个别名,然后在 IF 中使用它,这样 mysql 就不需要重新计算它。
作为一项要求,不完整的列在任何情况下都不能为空(例如,如果表任务为空)。
我的问题是,这样有效率吗? MySQL 是否需要每次都重新计算总和或者它会记住它?
最佳答案
这可能是更好的方法,因为您对性能
的计算较少使用 richard 发布的架构 - 参见 FIDDLE
SELECT
total,
num_complete,
total - num_complete as num_incomplete
FROM(
SELECT
COUNT(*) as total,
SUM(IF(t.completed > 0, 1, 0)) as num_complete
FROM status_log t
) as t
根据 OP 请求检查空表
SELECT
total,
num_complete,
total - num_complete as num_incomplete
FROM(
SELECT
COUNT(*) as total,
IF(COUNT(*) > 0, SUM(IF(t.completed > 0, 1, 0)), 0) as num_complete
FROM status_log t
) as t
你应该用另一种编程语言检查 null 或空表 ...一般来说 SQL 应该用于从表中查询..不是当它是空的时候......如果它完全是空的,那么在以另一种编程语言运行此查询时,您应该检查是否有空响应。这将大大提高它的性能。
关于mysql - 选择查询中重复聚合函数的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23476186/