【问题标题】:Group, Sort and Count in a single query在单个查询中进行分组、排序和计数
【发布时间】:2015-06-23 05:06:54
【问题描述】:

我正在尝试在名为“commodities”的表之一的单个查询中使用 GROUPSORTCOUNT

这是我的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. GROUPname
  2. SORTfamilysub_family,最后是name
  3. COUNT每个familysub_familyname 的行数(相同的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 计数了 Lemon 2 次,但我希望它只计数 1 次,因为 Fruits 中有一个 lemon em> sub_family 和另一个在 Tree 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

【问题讨论】:

  • 如何按对您的组有多个值的列进行排序?我觉得你很困惑。编辑您的查询并包含您的期望结果。
  • 根据你的帖子 'Lemon' 2 次,但我希望它只计算 1 根据你想要的结果 Agro 7 Fruits 4 Lemon 2 Wood 4树 3 柠檬 2 那么你的真正目标是什么?
  • 我的问题可能还不够清楚。如您所见,“Lemon”对每个 Lemon 计数 2 次(一个在 'Fruits' sub_family 中,另一个在 'Tree' sub_family 中)。但我只想算一次,因为这两个“柠檬”不属于同一个 sub_family。一个是水果,另一个是树。
  • 提供的数据样本中没有 coreid 列,但您在查询中引用了它们
  • 您提供的查询结果与此处提供的查询不匹配是证明sqlfiddle.com/#!9/e9206/3 所以您的查询返回 1 行,柠檬不是 2

标签: mysql sql sorting count group-by


【解决方案1】:

只是我对您的要求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

【讨论】:

  • 就是这样。非常感谢亚历克斯。
猜你喜欢
  • 2014-07-26
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 2016-06-17
  • 2014-09-28
  • 1970-01-01
相关资源
最近更新 更多