2015-04-16 88 views
4

我正在試圖在GROUP,SORTCOUNT中對我的名爲「商品」的表進行查詢。在一個查詢中對組進行排序和計數

這裏是我的MySql表的簡化:

family sub_family name  detailed_name 
Agro Grains  Wheat  Wheat per 1 mt 
Agro Grains  Corn  Corn per 1 mt 
Agro Grains  Sugar  Sugar per 1 mt 
Agro Fruits  Apple  Apple red 
Agro Fruits  Apple  Apple green 
Agro Fruits  Apple  Apple yellow 
Agro Fruits  Lemon  Lemon classic 
Wood Tree  Lemon  Lemon in logs 
Wood Tree  Oak   Oak in logs 
Wood Tree  Epicea  Epicea in logs 
Wood Packaging Kraftliner Krafliner 3mm 

我想:

  1. GROUP通過name
  2. SORT通過familysub_family和最後name
  3. COUNT的ñ行每個familysub_family然後name的umbers(在同一個sub_family

到目前爲止,我能夠做到的一切,但COUNT在同一sub_family

事實上,下面的查詢:

SELECT 
    TableC.family, 
    TableC.NbrFamily, 
    TableB.sub_family, 
    TableB.NbrSubFamily, 
    TableA.name, 
    TableA.NbrName 
FROM 
(
    SELECT 
     family, 
     sub_family, 
     name, 
     COUNT(DISTINCT commodities.id) AS NbrName 
    FROM commodities GROUP BY name 
) TableA 
INNER JOIN 
(
    SELECT 
     sub_family, 
     COUNT(DISTINCT commodities.id) AS NbrSubFamily 
    FROM commodities GROUP BY sub_family 
) TableB 
ON (TableA.sub_family = TableB.sub_family) 
INNER JOIN 
(
    SELECT 
     family, 
     COUNT(DISTINCT commodities.id) AS NbrFamily 
    FROM commodities GROUP BY family 
) TableC 
ON (TableA.family = TableC.family) 
GROUP BY TableA.name 
ORDER BY TableA.family,TableA.sub_family,TableA.name 

其結果如下:

family NbrFamily sub_family NbrSubFamily name  NbrName 
Agro 7   Grains  3    Wheat  1  
Agro 7   Grains  3    Corn  1   
Agro 7   Grains  3    Sugar  1  
Agro 7   Fruits  4    Apple  3 
Agro 7   Fruits  4    Lemon  2 
Wood 4   Tree  3    Lemon  2 
Wood 4   Tree  3    Oak   1  
Wood 4   Tree  3    Epicea  1 
Wood 4   Packaging 1    Kraftliner 1 

你可以看到,NbrName計數檸檬 2次,但我想它只能算它1次因爲一個檸檬水果sub_family另一個在sub_family

[更新]:這是我想要的結果:

family NbrFamily sub_family NbrSubFamily name  NbrName 
    Agro 7   Grains  3    Wheat  1  
    Agro 7   Grains  3    Corn  1   
    Agro 7   Grains  3    Sugar  1  
    Agro 7   Fruits  4    Apple  3 
    Agro 7   Fruits  4    Lemon  1 
    Wood 4   Tree  3    Lemon  1 
    Wood 4   Tree  3    Oak   1  
    Wood 4   Tree  3    Epicea  1 
    Wood 4   Packaging 1    Kraftliner 1 
+0

你怎麼能按具有多個值的列進行排序?我覺得你很困惑。編輯你的查詢幷包含你想要的*結果。 –

+0

根據你的帖子**'檸檬'2次,但我希望它根據你想要的結果只計算1 ** **農業7水果4檸檬2 木材4樹3檸檬2 **所以你是什麼真正的目標是? – Alex

+0

我的問題可能不夠清楚。正如你所看到的,對於每一個檸檬來說,「檸檬」會被計數2次(一次在「水果」子系列中,另一個在「樹」子系列中)。但是我想只計算一次,因爲這兩個'檸檬'不屬於同一個子系列。一個是水果,另一個是樹。 – SuperKiwi

回答

2

只是我的猜測是什麼,因爲它帶來期望的結果,你所要求的http://sqlfiddle.com/#!9/e9206/16

SELECT A.family, C.NbrFamily,A.sub_family,B.NbrSubFamily,A.name,COUNT(A.Name) 
FROM commodities as A 
LEFT JOIN (
    SELECT family,sub_family,COUNT(Name) AS NbrSubFamily 
    FROM commodities 
    GROUP BY family,sub_family 
) B 
ON A.sub_family = B.sub_family 
    AND A.family = B.family 
LEFT JOIN (
    SELECT family,COUNT(Name) AS NbrFamily 
    FROM commodities 
    GROUP BY family 
) C 

ON A.family = C.family 
GROUP BY A.family,A.sub_family,A.name 
ORDER BY A.id 
+0

就是這樣。非常感謝Alex。 – SuperKiwi