如何在 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