我有两个表:商品Và价格(一对多)
每个项目都有一个默认价格,但是这个价格可以在第二个表中被覆盖(在某些情况下)。
首先,我在获取所有项目并预先计算最低价格 - 默认价格与其覆盖当前价格(如果有的话?)之间的最小值时遇到了问题。
Bạn có thể thấy nó ở đây:http://sqlfiddle.com/#!2/f31d5/25
幸运的是,多亏了 stackoverflow(你可以在这里看到它:Rails select subquery (without finder_sql, if possible)),它已经解决了,但现在我遇到了类似的问题!
一旦我选择了所有项目,我能否确定新计算的字段 (min_price) 中的绝对最低(或最高)价格?
当然我试过这样的事情:http://sqlfiddle.com/#!2/f31d5/26
但是,它没有用。是否有任何智能 SQL-true 方法来获取这些值?
对于 SQLFiddle 中的这个特定场景,它应该返回 5 (MIN),或 500 (MAX)
当然,我可以像这样直接从定价表中选择它:
SELECT MIN(price) FROM prices;
但是,我不能依赖它,因为商品的默认价格可能更低,这样我就无法检查它(我认为,SELECT MIN/MAX 不适用于JOIN hoặc GROUP BY).
还有一件事要注意——我正在为我的搜索系统写这个,这只是它的一小部分,所以,“WHERE”子句在那里也很重要,因为并不是所有的项目都是实际上涉及。
有什么SMART方式(SQL方式)可以解决这个问题吗?
P.S 暂时我已经解决了这个问题,只是通过查询按 min_price (ASC/DESC) 排序并应用 LIMIT 1,然后从项目记录本身收集所需的值,但我对这个解决方案非常不满意, 所以我决定在这里问一下。
Cảm ơn
P.P.S 完全忘了提,我无法避免这个 SQL 查询,因为我有一个分页系统,它实际上附加了 LIMIT X,OFFSET Y。所以,我需要选择全局值(value),而不仅仅是特定页面!
您不需要第二次调用 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;
Tôi là một lập trình viên xuất sắc, rất giỏi!