从GROUP BY获取COUNT()

时间:2013-10-05 19:19:54

标签: mysql

我有一个令人难以置信的错综复杂的SQL查询(三个INNER JOINS),导致易于阅读的结果集如下(简化)。 我继承了db,因此无法更改任何现有表的结构,因此我必须执行复杂的查询才能达到这一点:

product_category    |   product_code
------------------------------------
Hardware                102
Hardware                104
Hardware                102
Software                205
Software                104

如果我只是做一个GROUP BY product_category,product_code,我会得到我感兴趣的大部分最终结果集:

product_category    |   product_code
------------------------------------
Hardware                102
Hardware                104
Software                205
Software                104

然而,缺少的是库存数量:

product_category    |   product_code    |   num_in_stock
--------------------------------------------------------
Hardware                102                 2
Hardware                104                 1
Software                205                 1
Software                104                 1

由于我希望COUNT()可以直接从GROUP BY语句完成的处理,我有点迷失。

到目前为止,这是SQL查询:

SELECT categories.product_category, codes.product_code FROM stock
INNER JOIN products ON stock.product_id = products.id
INNER JOIN codes ON products.code_id = codes.id
INNER JOIN categories ON codes.category_id = categories.id
GROUP BY categories.product_category, codes.product_code

表格如下:

  • CATEGORIES - 例如,“硬件”,“软件”
  • CODES - 例如,100,204(属于category
  • PRODUCTS - categories + codes的组合,无用的版本#
  • STOCK - 产品条目,如果有多个产品,则有多个条目

因此,这是如此混乱的原因是因为version #中无用的PRODUCTS字段。这意味着对于特定组合(例如,“硬件102”),可以多次输入PRODUCTS,每个组合都有不同的version #值,这将导致STOCKids引用不同的PRODUCTS,即使对我来说,它也是同一个产品。啊!

有什么想法吗?

修改

所以让我们说有一个产品“Misc 999”有两个不同的版本。这意味着{M}中的CATEGORIES,“999”的CODES(其中category_id属于“Misc”),PRODUCTS中有两个条目{1}}(两者都具有相同的code_id但具有不同的version信息 - 我忽略了这一点。

然后,如果我们有10个库存(一个版本中有3个,另一个版本中有7个,但我忽略了版本信息),STOCK表中将有10个条目,每个条目都将通过PRODUCTS(在这种情况下,两个不同的ID)引用id表。

2 个答案:

答案 0 :(得分:1)

目前还不完全清楚你想要什么,但也许这有效:

SELECT categories.product_category
     , codes.product_code
     , SUM(num_in_stock) as num_in_stock
FROM (
   SELECT product_id
        , count(*) as num_in_stock 
   FROM stock
   group by product_id
   ) a
INNER JOIN products 
ON a.product_id = products.id
INNER JOIN codes 
ON products.code_id = codes.id
INNER JOIN categories 
ON codes.category_id = categories.id
GROUP BY categories.product_category
       , codes.product_code

答案 1 :(得分:1)

只需将count(*)添加到您的select子句:

SELECT categories.product_category, codes.product_code, count(*) qty_in_stock
FROM stock
INNER JOIN products ON stock.product_id = products.id
INNER JOIN codes ON products.code_id = codes.id
INNER JOIN categories ON codes.category_id = categories.id
GROUP BY categories.product_category, codes.product_code

SQLFiddle here