我有一个令人难以置信的错综复杂的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 #
值,这将导致STOCK
从ids
引用不同的PRODUCTS
,即使对我来说,它也是同一个产品。啊!
有什么想法吗?
修改
所以让我们说有一个产品“Misc 999”有两个不同的版本。这意味着{M}中的CATEGORIES
,“999”的CODES
(其中category_id
属于“Misc”),PRODUCTS
中有两个条目{1}}(两者都具有相同的code_id
但具有不同的version
信息 - 我忽略了这一点。
然后,如果我们有10个库存(一个版本中有3个,另一个版本中有7个,但我忽略了版本信息),STOCK
表中将有10个条目,每个条目都将通过PRODUCTS
(在这种情况下,两个不同的ID)引用id
表。
答案 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。