如何在 MySQL 中结合 Max 和 Count 函数
How do I combine both Max and Count function in MySQL
我写了一个查询,要求我打印农民的姓名和他们拥有的不同类型农产品的数量。
他们现在要求我扩展该查询以仅包括最大产量并打印农民的姓名。但要注意的是,我不能使用限制功能。我的查询是:
select Farmer.FarmerName, count(Produce.ProduceID) as 'Produce number'
from Supplies
right join Farmer on Supplies.FarmerID=Farmer.FarmerID
left join Produce on Supplies.ProduceID=Produce.ProduceID
group by Farmer.FarmerName
order by count(Produce.ProduceID) desc;
我想要这两种情况的答案,我只需要打印农产品数量最多的农民的名字。在我必须同时打印最高产量和农民姓名的地方。
编辑:最大产量定义为每个农民生产的不同类型农产品的最高总和。假设一个农民生产 3 种蔬菜,另一个农民生产 4 种蔬菜。蔬菜的最大数量为 4。
按列分组时,不能select任何其他未包含在“分组依据”语句中的列。
要同时显示农民的姓名和产品,您需要将它们包含在 GROUP BY 语句中:
select Farmer.FarmerName, Produce.ProduceID, count(Produce.ProduceID) as 'Produce number'
from Supplies
right join Farmer on Supplies.FarmerID=Farmer.FarmerID
left join Produce on Supplies.ProduceID=Produce.ProduceID
GROUP BY Farmer.FarmerName, Produce.ProduceID
ORDER BY COUNT(Produce.ProduceID) DESC
此查询应汇总农民的姓名和农产品 ID,并按最大产量的顺序显示。如果您正在寻找顶级农民 - 农产品对,那么您可以将 TOP 1 包括在内:
select TOP 1 Farmer.FarmerName, Produce.ProduceID, count(Produce.ProduceID) as 'Produce number'
从阅读问题来看,您似乎想要一份所有种植最多农产品的农民的名单。即:事物的数量。你可以让一位农民种植玉米、小麦、大豆,而另一位农民种植西兰花、南瓜和大豆。他们都种植相同数量的东西。所以我猜你想知道“任何一个农民种植的最多物品数量是多少”。那将开始您的列表。您不需要加入农民或产品 table,因为供应有农民 ID。我按just下单,大家可以直观的看到哪个农夫(按ID)有多少东西的结果
select
S.FarmerID,
count(*) as ThingsGrownByFarmer
from
Supplies S
group by
S.FarmerID
order by
count(*) DESC
现在,既然你声明你不能使用 LIMIT,那么你可以使用每个农民的计数的 MAX() 来包装上面的内容,例如
select
max( PreQuery.ThingsGrownByFarmer ) MostThings
from
( select
S.FarmerID,
count(*) as ThingsGrownByFarmer
from
Supplies S
group by
S.FarmerID ) PreQuery
因此,以上内容现在将为您提供一条记录,其中包含任何个体农民的最大数量 grown/supplied。现在,根据开场白,多个农民可以种植/供应多个具有相同最大数量的物品。现在,您希望所有达到该计数的农民都可以向他们展示。
现在,既然你声明你不能使用 LIMIT,那么你可以使用每个农民的计数的 MAX() 来包装上面的内容。在这种情况下,我从任何农民的 MostThings 开始查询。然后返回查询每个农民的所有计数,只要它们与最高计数生产的事物的计数相匹配。最后加入那个结果,因为我们现在有农民的 ID 给农民 table 来得到农民的名字。
select
MaxProduced.MostThings,
F.FarmerName
from
( select
max( PreQuery.ThingsGrownByFarmer ) MostThings
from
( select
S.FarmerID,
count(*) as ThingsGrownByFarmer
from
Supplies S
group by
S.FarmerID ) PreQuery ) MaxProduced
JOIN ( select
S.FarmerID,
count(*) as ThingsGrownByFarmer
from
Supplies S
group by
S.FarmerID ) AllFarmersCounts
on MaxProduced.MostThings = AllFarmersCounts.ThingsGrownByFarmer
JOIN Farmer F
on AllFarmersCounts.FarmerID = F.FarmerID
很多时候,您需要将问题分解以查看您要查找的部分。写一个查询来得到那个确切的东西。然后用于获取下一层,然后你可以在完成先决条件后加入所有其余部分。
跟进
要处理没有提供任何东西的农民,只需从农民开始,然后左连接到没有任何东西的供应。
select
F.FarmerName
from
Farmers F
Left Join Supplies S
on F.FarmerID = S.FarmerID
where
S.FarmerID IS NULL
要将此添加到原始答案中,我会更改为
[original full query]
UNION ALL
select
F.FarmerName,
0 ThingsGrownByFarmer
from
Farmers F
Left Join Supplies S
on F.FarmerID = S.FarmerID
where
S.FarmerID IS NULL
order by
ThingsGrownByFarmer DESC
我写了一个查询,要求我打印农民的姓名和他们拥有的不同类型农产品的数量。
他们现在要求我扩展该查询以仅包括最大产量并打印农民的姓名。但要注意的是,我不能使用限制功能。我的查询是:
select Farmer.FarmerName, count(Produce.ProduceID) as 'Produce number'
from Supplies
right join Farmer on Supplies.FarmerID=Farmer.FarmerID
left join Produce on Supplies.ProduceID=Produce.ProduceID
group by Farmer.FarmerName
order by count(Produce.ProduceID) desc;
我想要这两种情况的答案,我只需要打印农产品数量最多的农民的名字。在我必须同时打印最高产量和农民姓名的地方。
编辑:最大产量定义为每个农民生产的不同类型农产品的最高总和。假设一个农民生产 3 种蔬菜,另一个农民生产 4 种蔬菜。蔬菜的最大数量为 4。
按列分组时,不能select任何其他未包含在“分组依据”语句中的列。
要同时显示农民的姓名和产品,您需要将它们包含在 GROUP BY 语句中:
select Farmer.FarmerName, Produce.ProduceID, count(Produce.ProduceID) as 'Produce number'
from Supplies
right join Farmer on Supplies.FarmerID=Farmer.FarmerID
left join Produce on Supplies.ProduceID=Produce.ProduceID
GROUP BY Farmer.FarmerName, Produce.ProduceID
ORDER BY COUNT(Produce.ProduceID) DESC
此查询应汇总农民的姓名和农产品 ID,并按最大产量的顺序显示。如果您正在寻找顶级农民 - 农产品对,那么您可以将 TOP 1 包括在内:
select TOP 1 Farmer.FarmerName, Produce.ProduceID, count(Produce.ProduceID) as 'Produce number'
从阅读问题来看,您似乎想要一份所有种植最多农产品的农民的名单。即:事物的数量。你可以让一位农民种植玉米、小麦、大豆,而另一位农民种植西兰花、南瓜和大豆。他们都种植相同数量的东西。所以我猜你想知道“任何一个农民种植的最多物品数量是多少”。那将开始您的列表。您不需要加入农民或产品 table,因为供应有农民 ID。我按just下单,大家可以直观的看到哪个农夫(按ID)有多少东西的结果
select
S.FarmerID,
count(*) as ThingsGrownByFarmer
from
Supplies S
group by
S.FarmerID
order by
count(*) DESC
现在,既然你声明你不能使用 LIMIT,那么你可以使用每个农民的计数的 MAX() 来包装上面的内容,例如
select
max( PreQuery.ThingsGrownByFarmer ) MostThings
from
( select
S.FarmerID,
count(*) as ThingsGrownByFarmer
from
Supplies S
group by
S.FarmerID ) PreQuery
因此,以上内容现在将为您提供一条记录,其中包含任何个体农民的最大数量 grown/supplied。现在,根据开场白,多个农民可以种植/供应多个具有相同最大数量的物品。现在,您希望所有达到该计数的农民都可以向他们展示。
现在,既然你声明你不能使用 LIMIT,那么你可以使用每个农民的计数的 MAX() 来包装上面的内容。在这种情况下,我从任何农民的 MostThings 开始查询。然后返回查询每个农民的所有计数,只要它们与最高计数生产的事物的计数相匹配。最后加入那个结果,因为我们现在有农民的 ID 给农民 table 来得到农民的名字。
select
MaxProduced.MostThings,
F.FarmerName
from
( select
max( PreQuery.ThingsGrownByFarmer ) MostThings
from
( select
S.FarmerID,
count(*) as ThingsGrownByFarmer
from
Supplies S
group by
S.FarmerID ) PreQuery ) MaxProduced
JOIN ( select
S.FarmerID,
count(*) as ThingsGrownByFarmer
from
Supplies S
group by
S.FarmerID ) AllFarmersCounts
on MaxProduced.MostThings = AllFarmersCounts.ThingsGrownByFarmer
JOIN Farmer F
on AllFarmersCounts.FarmerID = F.FarmerID
很多时候,您需要将问题分解以查看您要查找的部分。写一个查询来得到那个确切的东西。然后用于获取下一层,然后你可以在完成先决条件后加入所有其余部分。
跟进
要处理没有提供任何东西的农民,只需从农民开始,然后左连接到没有任何东西的供应。
select
F.FarmerName
from
Farmers F
Left Join Supplies S
on F.FarmerID = S.FarmerID
where
S.FarmerID IS NULL
要将此添加到原始答案中,我会更改为
[original full query]
UNION ALL
select
F.FarmerName,
0 ThingsGrownByFarmer
from
Farmers F
Left Join Supplies S
on F.FarmerID = S.FarmerID
where
S.FarmerID IS NULL
order by
ThingsGrownByFarmer DESC