【问题标题】:MySQL - limiting group bysMySQL - 限制分组
【发布时间】:2011-02-02 18:12:32
【问题描述】:

假设您有一张桌子,上面放着产品。每个产品都有一个价格并且属于一个特定的类别。此外,每个产品还属于一个子类别。现在,如果您想为每个子类别找到最便宜的产品怎么办?这很简单:

SELECT MIN(price), sub_category FROM products GROUP BY sub_category

对吗?

现在,假设您只想为上述结果的每个类别(而不是子类别)显示最多 2 个产品。有没有办法在 SQL 中实现这一点?

【问题讨论】:

  • 为什么不使用服务器脚本限制/限制结果?
  • 这是一个解决方案。但是如果有很多行,最好在SQL服务器上做,只传输相关的。
  • 您的查询错误,它只会产生一个结果,因为您没有将 sub_category 字段添加到您的 select 子句中。

标签: sql mysql group-by


【解决方案1】:

假设产品有一个唯一的 id,你可以试试这个:

select * from products p
where p.id in (select p1.id from products p1 
    where p.category = p1.category order by price limit 0,2)
and price = (select min(price) from products p2 
    where p2.sub_category = p.sub_category)

编辑:@wimvds:感谢您指出错误。

编辑 2:如果子类别中有不止一种价格最低的产品,我想这仍然是错误的。

【讨论】:

  • 我认为这可能会从一个子类别返回 2 个产品,并且只会导致该类别的主查询的一个结果。作者希望有 2 个来自不同的子类别。不过我可能是错的。您可以按子查询中的子类别进行分组,这有望完成这项工作。
  • -1 与问题中的问题相同,此查询只会返回一个结果。
  • @Yasen Zhelev:子查询不需要分组。最终你想要最大。无论子类别如何,一个类别中的 2 件最便宜的产品。
  • 那他为什么不直接得到它们。循环浏览类别并获得 2 个最便宜的产品。或者他想在一个查询中完成?
  • @Yasen Zhelev:是的,我认为重点是使用单个查询来获取它们。
【解决方案2】:

不应该是这样的吗:

select * from products p, products p1 where p.id in (select min(price) from products p2      where p2.sub_category = p2.sub_category) and p1.category=p.category order by p.price limit 0,2

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多