在MySQL中已经为GROUPed的查询上使用GROUP_CONCAT

时间:2013-02-03 19:00:58

标签: mysql

我有一个需要创建的大订单清单,我需要按订单获取产品代码及其数量清单。

为了简化,我展示了单个订单的示例,但外部查询需要为系统中的每个订单提供此结果。

到目前为止,我有以下内容:

mysql> select ProductCode,Quantity from OrderProducts where Order_ID = X;
+-------------+----------+
| ProductCode | Quantity |
+-------------+----------+
| PROD1       |        1 |
| PROD2       |        1 |
| PROD1       |        1 |
+-------------+----------+
3 rows in set (0.00 sec)

mysql> SELECT CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') FROM OrderProducts WHERE Order_ID = X GROUP BY OrderProducts.ProductCode;
+------------------------------------------------------------------------+
| CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') |
+------------------------------------------------------------------------+
| PROD1 (2)                                                              |
| PROD2 (1)                                                              |
+------------------------------------------------------------------------+
2 rows in set (0.00 sec)

我需要的是上面查询的GROUP_CONCAT结果,但它不会让我围绕上面显示的CONCAT包装GROUP_CONCAT,因为我认为因为SUM()已经在进行分组。这是我需要回来的:

PROD1 (2),PROD2 (1)

修改

我不清楚上面使用的查询。我将使用该查询作为select中的子查询,该查询将查询Orders中的所有订单。以下是查询的更新版本:

SELECT 
  ( 
    SELECT 
      GROUP_CONCAT(SerialNumberedProductCount) 
    FROM  
    ( 
      SELECT 
        OrderProducts.Order_ID,
        CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') AS SerialNumberedProductCount 
       FROM  
        OrderProducts, Products 
       WHERE 
        OrderProducts.Order_ID = Orders.Order_ID AND 
        OrderProducts.Product_ID = Products.Product_ID AND 
        Products.IsSerialNumbered = 1 
       GROUP BY 
        OrderProducts.ProductCode
    ) SerialNumberedProductCountsSubQuery 
    WHERE 
      SerialNumberedProductCountsSubQuery.Order_ID = Orders.Order_ID
  ) AS SerialNumberedProductCounts 
FROM 
  Orders

通过上述查询,我​​收到以下错误:

ERROR 1054 (42S22): Unknown column 'Orders.Order_ID' in 'where clause'

3 个答案:

答案 0 :(得分:2)

要应用其他聚合,您需要将其包装在子查询中。这将对子查询返回的所有行应用聚合GROUP_CONCAT(),就像所需示例的输出一样。由于内部子查询仅返回已聚合的列,因此外部查询中不需要GROUP BY

SELECT GROUP_CONCAT(prod_sum)
FROM (
  SELECT CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') AS prod_sum 
  FROM OrderProducts 
  WHERE Order_ID = 'X'
  GROUP BY OrderProducts.ProductCode
) subq

http://sqlfiddle.com/#!2/68bca/4

重新发布后更新

要将子查询的结果与Orders相结合,您可能应该加入整个构造而不是使用子选择。

SELECT 
  /* Replace these with the columns you actually need */
  Orders.*,
  SerialNumberedProductCounts.*
FROM 
  Orders
  LEFT JOIN ( 
    SELECT
      Order_ID, 
      GROUP_CONCAT(SerialNumberedProductCount) 
    FROM  
    ( 
      SELECT 
        OrderProducts.Order_ID,
        CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') AS SerialNumberedProductCount 
       FROM  
        OrderProducts, Products 
       WHERE 
        OrderProducts.Product_ID = Products.Product_ID AND 
        Products.IsSerialNumbered = 1 
       GROUP BY 
        OrderProducts.ProductCode
    ) SerialNumberedProductCountsSubQuery 
    GROUP BY Order_Id
  ) AS SerialNumberedProductCounts 
  ON SerialNumberedProductCounts.Order_ID = Orders.Order_ID

答案 1 :(得分:1)

您可以像这样使用

SELECT
  GROUP_CONCAT(con) as Con
from (SELECT
    CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') as Con
      FROM OrderProducts
      WHERE Order_ID = X
      GROUP BY OrderProducts.ProductCode
) as r

答案 2 :(得分:1)

SELECT GROUP_CONCAT(CONCAT(productcode,'(',n,')')) summary 
  FROM 
     ( SELECT productcode
            , SUM(quantity) n 
         FROM orderproducts 
        WHERE order_id = x
        GROUP 
           BY productcode
     ) x;