0

私は次のクエリを持っています:

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」列の合計が必要です。現在、上記のクエリによって返されたすべての行を繰り返し処理してから、Rubyの「emp_count」でSUMを実行します。ただし、行が多いため、多くのメモリを消費します。

SQLの「emp_count」を合計してこの数値だけを返すにはどうすればよいですか?

4

1 に答える 1

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のドキュメントでサブクエリの詳細を読むことができます。また、MySQLで複数のサブクエリ行をSUM()する方法も参照してください。

于 2012-07-24T17:42:35.900 に答える