在MySQL中选择MIN值后选择MIN(MAX)

时间:2014-02-16 18:27:43

标签: mysql sql select max min

我有两张桌子:商品价格(一对多)

每个项目的默认价格,但在第二个表格中可以覆盖此价格(在某些情况下)。

首先我遇到了提取所有项目的问题,并预先计算了默认值与其当前价格(如果有的话)之间的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,而不仅仅是特定页面!

1 个答案:

答案 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;