我有两张桌子:商品和价格(一对多)
每个项目的默认价格,但在第二个表格中可以覆盖此价格(在某些情况下)。
首先我遇到了提取所有项目的问题,并预先计算了默认值与其当前价格(如果有的话)之间的MINIMUM PRICE - MIN。
您可以在此处查看:http://sqlfiddle.com/#!2/f31d5/25
幸运的是,它得到了解决,感谢stackoverflow(你可以在这里看到它:Rails select subquery (without finder_sql, if possible)),但现在我遇到了类似的问题!
一旦我选择了所有项目,我可以确定新计算字段( min_price )的绝对MIN(或MAX)价格吗?
当然我尝试过这样的事情:http://sqlfiddle.com/#!2/f31d5/26
但是,它没有用。有没有任何聪明的SQL-true方法来获取这些值?
对于SQLFiddle中的这个特定场景,它应该返回 5 (MIN),或 500 (MAX)
当然,我可以直接从定价表中选择它:
选择MIN(价格)FROM价格;
但是,我不能依赖它,因为项目的默认价格可能更低,这样我无法检查它(我认为, SELECT MIN / MAX 不适用于 JOIN 或 GROUP BY )。
还有一件事需要注意 - 我正在为我的搜索系统写这个,这只是它的一小部分,所以,“WHERE” - 这里也非常重要,因为并非所有项目都是实际参与。
有没有SMART方法(SQL-way)我能解决这个问题吗?
PS暂时我只是通过查询按min_price(ASC / DESC)命令并应用LIMIT 1然后从项目记录本身收集所需的值来解决问题,但我对此解决方案非常不满意所以我决定在这里问一下。
由于
PPS 完全忘记提及,我无法避免这种SQL查询,因为我有一个实际附加LIMIT X,OFFSET Y的分页系统。所以,我需要选择值GLOBALLY,而不仅仅是特定页面!
答案 0 :(得分:1)
您不需要第二次拨打min()
。我认为这样做你想要的:
SELECT LEAST(IFNULL(MIN(prices.price),
items.default_price),
default_price) as min_price
FROM items LEFT OUTER JOIN
prices
ON prices.item_id = items.id
GROUP BY items.id;
如果您希望所有项目的价格最低,则可以删除group by
子句。但是,我认为子查询对于意图更清楚:
select min(min_price)
from (SELECT LEAST(IFNULL(MIN(prices.price),
items.default_price),
default_price) as min_price
FROM items LEFT OUTER JOIN
prices
ON prices.item_id = items.id
GROUP BY items.id
) p;