Php Mysql相同字段但不同条件的总和

Php Mysql相同字段但不同条件的总和,php,mysql,Php,Mysql,我有下表: CREATE TABLE IF NOT EXISTS `data` ( `id` int(8) NOT NULL AUTO_INCREMENT, `amount` decimal(17,2) DEFAULT '0.00', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=999999; 我希望从单个查询返回所有记录的总和,以及前100条记录的总和 现在我使用两个单独的查询

我有下表:

CREATE TABLE IF NOT EXISTS `data` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `amount` decimal(17,2) DEFAULT '0.00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=999999;
我希望从单个查询返回所有记录的总和,以及前100条记录的总和

现在我使用两个单独的查询:

SELECT COALESCE(SUM(amount),0) FROM data
SELECT COALESCE(SUM(amount),0) FROM data WHERE id<=100
从数据中选择合并(总和(金额),0)

从数据中选择COALESCE(SUM(amount),其中id这些查询对前100行进行求和,然后从第100行开始,直到任意大的数字,这将获得所有行

select sum(a.amount) from (select amount from data limit 100) a
select sum(a.amount) from (select amount from data limit 100,999999999) a
您对这两个变量的想法不会导致优化,因为它很可能在数据库引擎中采用较慢的路径。您可以将上述两个查询组合为:

select (select sum(amount) from data limit 100) as acount, (select sum(amount) from data limit 100,999999999) as bcount from dual
但这可能不会更快,因为数据库会在内部将其分为两个查询。

这样如何:

select sum(if(id <= 100, amount, 0)) as first_hundred,
       sum(if(id <= 100, 0, amount)) as rest
from data

选择sum(如果(id您可以使用
sum
语句:

SELECT SUM(IF(`id` <= 100, `amount`, 0)) AS `hundred group`,
       SUM(IF(`id` >= 0, `amount`, 0)) AS `all`
选择SUM(如果(`id`=0,`amount`,0))作为`all`

谢谢你的回答。有没有办法让数据库不会在内部将其分成两个查询?没有,这对数据库引擎的工作方式非常重要。任何你提出的棘手和程序性的问题都会从高度优化的查询路径中消失,并且很可能比这两个查询慢也就是说,使用单查询版本可以节省一点时间。虽然数据库仍将运行两个单独的查询,但只需向数据库发出一个请求,就可以节省数据库连接和结果传递的开销。我一直在想,希望数据库指针能够遍历表的每一行,然后根据比较结果另外,它可以将
amount
值放在first100的和或remaining100的和中,而不必对每一行进行两次分析。您可以让它这样做,但DB引擎必须检查每一行的比较条件,这最终会变慢。
SELECT SUM(IF(`id` <= 100, `amount`, 0)) AS `hundred group`,
       SUM(IF(`id` >= 0, `amount`, 0)) AS `all`