MySQL中COUNT()列的SUM()

时间:2012-07-24 17:39:27

标签: mysql sql

我有以下查询:

SELECT COUNT(employees.id) AS emp_count 
FROM `orders` 
INNER JOIN `companies` ON `companies`.`id` = `orders`.`company_id` 
INNER JOIN employees ON employees.company_id = companies.id
  AND (employees.deleted_at >= companies.activate_at OR employees.deleted_at IS NULL)                       
  AND employees.created_at <= companies.activate_at 
WHERE 
  (companies.activate_at BETWEEN '2012-01-31 23:00:00' AND '2012-02-29 22:59:59'                    
   AND orders.type = 'Order::TrialActivation'
   AND orders.state = 'completed')

我需要所有“emp_count”列的SUM。目前我遍历上面查询返回的所有行,然后在Ruby中的“emp_count”上进行SUM。但是有很多行,所以这占用了很多内存。

我如何对SQL中的“emp_count”进行SUM并返回这个数字?

1 个答案:

答案 0 :(得分:1)

---更新:---

由于问题已更新,我将更新我的回答:

如果您尝试根据WHERE语法从查询中获取行数,则可以使用COUNT()。但是,如果您想要查询中所有employees.id值的总和,请将COUNT(employees.id)更改为SUM(employees.id),这应该可以执行您想要的操作。

---原始答案---

尝试使用子查询,有点像这样(未经过测试的代码):

SELECT SUM(x.emp_count) FROM (
    SELECT COUNT(employees.id) AS emp_count 
    FROM `orders` 
    INNER JOIN `companies` ON `companies`.`id` = `orders`.`company_id` 
    INNER JOIN employees ON employees.company_id = companies.id
      AND (employees.deleted_at >= companies.activate_at OR employees.deleted_at IS NULL)                       
      AND employees.created_at <= companies.activate_at 
    WHERE 
      (companies.activate_at BETWEEN '2012-01-31 23:00:00' AND '2012-02-29 22:59:59'                    
       AND orders.type = 'Order::TrialActivation'
       AND orders.state = 'completed')
) x;

您可以在MySQL documentation中详细了解子查询,另请参阅:How to SUM() multiple subquery rows in MySQL?