【问题标题】:Fetch Only The Cheapest Prices?只获取最便宜的价格?
【发布时间】:2010-11-16 21:39:18
【问题描述】:

我有一个产品表,可以有多个同名但价格不同的产品,我只想显示每个产品的最低价格。

表格示例:

TABLE: Products(name,price)
---------------------------
Banana -- 1,25
Banana -- 1,10
Strawberry -- 2,43
Apple -- 1,11
Apple -- 4,12
Apple -- // Some Products Can Have the Price Column Empty!!

我想要一个 MySQL 查询来得到这个:

  • 香蕉起价:$1,10
  • 草莓起价:$2,43
  • 苹果起价:$1,11

谢谢!

【问题讨论】:

    标签: sql mysql aggregate-functions


    【解决方案1】:

    在我的脑海中,像

    按名称从产品组中选择名称,最小值(价格);

    查看此链接了解更多信息。 http://www.techonthenet.com/sql/group_by.php

    然后使用 PHP 显示您希望的数据,例如在表格等中。

    另外,您还没有说价格字段是否可以为NULL。 您还没有说您的姓名字段是否可以混合大小写,例如“bananas”或“Bananas”或类似名称。如果是这样,那么您可能需要在名称字段上调用 ​​UPPER(TRIM(name)) 或类似的名称来对其进行规范化。

    【讨论】:

    • 这是忽略价格列中没有价值的产品吗?
    【解决方案2】:

    用途:

      SELECT p.name,
             MIN(REPLACE(p.price, ',', '')) AS minprice
        FROM PRODUCTS p
    GROUP BY p.name
    

    在尝试获取最低数值时,将价格存储为字符串可能会导致不必要的麻烦,因此我使用了 REPLACE 函数来删除字符。但这假设所有值都有相关的美分。

    如果最小值为 NULL,聚合函数 MIN(和 MAX)将返回 NULL。如果您希望这些显示为零:

      SELECT p.name,
             COALESCE(MIN(REPLACE(p.price, ',', '')), 0) AS minprice
        FROM PRODUCTS p
    GROUP BY p.name
    

    这就是为什么你不应该存储格式——将它应用到表示层中,这样你就可以适应其他格式。

    【讨论】:

    • 我认为像 0,67 这样的价格会被视为 67?
    • @David:只要每个值都有相关的美分,就可以了。 IE; 1,00 将是 100...
    • @Matt H: Yes, MIN/MAX 接受字符串。
    【解决方案3】:

    从价格 NULL order by price desc 的产品中选择不同的名称、价格

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多