【问题标题】:MySQL - Nested select with nested groupingMySQL - 具有嵌套分组的嵌套选择
【发布时间】:2014-08-23 13:33:34
【问题描述】:

我有两个表,我正在从中构建一些统计信息,所以我正在计算多个列和表,我的问题是当我尝试加入另一个表并将其分组到嵌套语句中时,我不断得到以下信息运行代码时出错。

General error: 2014 Cannot execute queries while other unbuffered queries are active...

这是场景:

++============================================================================++
||                               CLIENTS TABLE                                ||
++=======+===============+==============+==============+======================++
|   id   |   firstname   |   lastname   |     email    |      created_at       |
+--------+---------------+--------------+--------------+-----------------------+
|    1   |     JOHN      |      DOE     | john@doe.com |  2014-08-22 20:10:30  |
+--------+---------------+--------------+--------------+-----------------------+
|    2   |     JUNE      |      DAE     | june@dae.com |  2014-07-28 18:12:08  |
+--------+---------------+--------------+--------------+-----------------------+

++============================================================================++
||                               PURCHASES TABLE                              ||
++=======+===============+=============================+======================++
|   id   |   client_id   |     transaction_status      |      created_at       |
+--------+---------------+-----------------------------+-----------------------+
|    1   |        1      |          COMPLETED          |  2014-08-22 20:10:30  |
+--------+---------------+-----------------------------+-----------------------+
|    2   |        2      |          INCOMPLETE         |  2014-08-22 20:10:30  |
+--------+---------------+-----------------------------+-----------------------+
|    1   |        2      |          COMPLETED          |  2014-08-22 20:10:30  |
+--------+---------------+-----------------------------+-----------------------+
|    2   |        1      |          COMPLETED          |  2014-08-22 20:10:30  |
+--------+---------------+-----------------------------+-----------------------+

这是我计算的一些东西:

  1. 全球客户总数
  2. 当月客户总数
  3. 过去一个月的客户总数
  4. 最后注册的客户
  5. 已完成购买的客户(失败)

最后这是我失败的查询:

SELECT 
  ( SELECT 
      COUNT(*) 
    FROM
      clients
  ) AS 
      total_registered_clients,

  ( SELECT 
      COUNT(*) 
    FROM 
      clients 
    AND 
      (YEAR(created_at) = YEAR(CURRENT_DATE)) 
    AND 
      (MONTH(created_at) = MONTH(CURRENT_DATE)) 
  ) AS 
      current_month_registered_clients,

  ( SELECT 
      COUNT(*) 
    FROM 
      clients 
    AND 
      created_at 
    BETWEEN 
      (CURRENT_DATE - INTERVAL 1 MONTH) 
    AND 
      CURRENT_DATE 
  ) AS 
      last_month_registered_clients,

  -- This part fails
  ( SELECT
      COUNT(*)
    FROM
      clients
    INNER JOIN
      purchases
    WHERE
      purchases.client_id = clients.id
    AND
      purchases.transaction_status = 'completed'
    GROUP BY
      purchases.client_id
   ) AS
       clients_with_purchases

编辑: 我对 var_dump 的预期结果是:

[0] =>
object(stdClass)#60 (10) {
  ["total_registered_clients"]=>
    string(1) "2"
  ["current_month_registered_clients"]=>
    string(1) "1"
  ["last_month_registered_clients"]=>
    string(1) "1"
  ["clients_with_purchases"]=>
    string(1) "2"

}

【问题讨论】:

  • 由于GROUP BY,失败的部分返回多行。当您使用 SELECT 作为表达式时,它必须返回单个值。你希望这能做什么?
  • @Barmar 我编辑了问题以反映我的预期结果。
  • 为什么clients_with_purchases 只是一个数字?你有GROUP BY purchases.client_id,所以你会得到每个客户的购买计数。 SQL 中的last_registered_client 在哪里?
  • @Barmar 抱歉,我已经添加了 last_registered_client 的查询,但为了不让问题这么久而删除了它,我从预期的结果编辑中删除了它,我不知道 GROUP BY 返回了一个每个客户计数。 @Used_by_already 的答案很完美。感谢您的帮助@Barmar。

标签: mysql sql


【解决方案1】:

要删除该错误:

INNER JOIN
      purchases
    ON    -- not WHERE
      purchases.client_id = clients.id

并删除 GROUP BY

但是在第三个查询中试图计算已购买的客户数量或购买数量? (您正在计算购买量)

统计已购买客户数量的两种方法

SELECT
      COUNT(DISTINCT clients.id)
FROM clients
      INNER JOIN purchases
                  ON purchases.client_id = clients.id
                        AND purchases.transaction_status = 'completed'

SELECT
      COUNT(*)
FROM clients
WHERE EXISTS (
            SELECT
                  1
            FROM purchases
            WHERE transaction_status = 'completed'
                  AND clients.id = purchases.client_id
      )

【讨论】:

  • 这很完美!用你提供的第一种方法,我试图统计完成购买的客户,忽略了ON而不是WHERE,谢谢指正。干杯!
【解决方案2】:
SELECT 
  ( SELECT 
      COUNT(*) 
    FROM
      clients
  ) AS 
      total_registered_clients,

  ( SELECT 
      COUNT(*) 
    FROM 
      clients 
    where
      (YEAR(created_at) = YEAR(GETDATE())) 
    AND 
      (MONTH(created_at) = MONTH(GETDATE())) 
  ) AS 
      current_month_registered_clients,

  ( SELECT 
      COUNT(*) 
    FROM 
      clients 
    where 
      created_at 
    BETWEEN 
      (dateadd(m,-1,GETDATE())  ) 
    AND 
      GETDATE() 
  ) AS 
      last_month_registered_clients,

  -- This part fails
  ( SELECT
      COUNT(*)
    FROM
      clients
    INNER JOIN
      purchases
    on
      purchases.client_id = clients.id
    where
      purchases.transaction_status = 'completed'

   ) AS
       clients_with_purchases

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2019-01-06
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2013-07-17
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多