在我的数据库表中,我有很多产品(其中有几个是同一产品)。如果表中的产品是例如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)
但正如我上面所写,我正在考虑一个选项,如何获得价格范围......是否可以在一个查询中进行?
答案 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是否会起作用,但我怀疑它可能会起作用。