使用GROUP BY的复杂查询和MySQL中的价格范围

时间:2011-07-06 19:44:14

标签: mysql sql ruby-on-rails-3

在我的数据库表中,我有很多产品(其中有几个是同一产品)。如果表中的产品是例如5次,所以首先它的价格是10美元,然后是20美元,30美元,40美元和50美元。

我正在尝试发表声明,每个产品只打印一次,如果产品将存储在表格中,例如5倍以上,所以我想打印一下这款产品的价格范围。例如:

Mobile phone: $300
Bicycle: $1000
T-Shirt blue: $10 - $30

存在任何优雅的方式吗?
我想尝试以下方式:

Product.find(:all, 
             :per_page => 20, :page => page,
             :group => "name",
             :order => name)

但正如我上面所写,我正在考虑一个选项,如何获得价格范围......是否可以在一个查询中进行?

2 个答案:

答案 0 :(得分:1)

select
    name,
    if(min_price = max_price, concat('$', min_price), concat('$', min_price, ' - $', max_price) as price
from (select
      name,
      min(price) as min_price,
      max(price) as max_price
      from product
      group by 1) x

答案 1 :(得分:1)

不确定。查询应该看起来像这样:

SELECT category, (SELECT MAX(price)
                  FROM products as b
                  WHERE a.category = b.category),
                 (SELECT MIN(price)
                  FROM products as b
                  WHERE b.category = a.category)
FROM products 
GROUP BY category

我建议您使用显示代码构建格式,但不在查询中处理。


考虑一下,这是另一个版本:

WITH priceRange (category, min, max) as (SELECT category, MIN(price), max(price)
                                         FROM products
                                         GROUP BY category)
SELECT productDetails, min, max
FROM products as a
JOIN priceRange as b
ON b.category = a.category

甚至可能表现更好。


好的,这实际上没有使用RoR,只看文档....
您可能遇到的一个问题是,您正在尝试将字段授予对象,而不是在数据库中。您可能需要将这些字段专门选择到新对象中,或者在数据库外部执行分组工作。那说......
似乎有一个find_by_sql方法,允许您输入您选择的SQL查询。我不确定CTE是否会起作用,但我怀疑它可能会起作用。