在单个查询中进行分组、排序和计数
Group, Sort and Count in a single query
我正在尝试在单个查询中 GROUP
、SORT
和 COUNT
我的 table 之一 'commodities'.
这是我的 MySql
table 的简化:
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
我愿意:
GROUP
来自 name
SORT
由 family
、sub_family
最后 name
COUNT
每个 family
、sub_family
和 name
的行数(相同 sub_family
)
到目前为止,我在同一个 sub_family
.
中完成了除 COUNT
之外的所有操作
确实是下面的查询:
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 次,因为一个 lemon 在 Fruits 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
我猜你想要什么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
我正在尝试在单个查询中 GROUP
、SORT
和 COUNT
我的 table 之一 'commodities'.
这是我的 MySql
table 的简化:
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
我愿意:
GROUP
来自name
SORT
由family
、sub_family
最后name
COUNT
每个family
、sub_family
和name
的行数(相同sub_family
)
到目前为止,我在同一个 sub_family
.
COUNT
之外的所有操作
确实是下面的查询:
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 次,因为一个 lemon 在 Fruits 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
我猜你想要什么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