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

标签 mysql sql select max min

我有两个表:商品价格(一对多)

每个项目都有一个默认价格,但是这个价格可以在第二个表中被覆盖(在某些情况下)。

首先,我在获取所有项目并预先计算最低价格 - 默认价格与其覆盖当前价格(如果有的话?)之间的最小值时遇到了问题。

你可以在这里看到: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 不适用于JOINGROUP BY)。

还有一件事要注意——我正在为我的搜索系统写这个,这只是它的一小部分,所以,“WHERE”子句在那里也很重要,因为并不是所有的项目都是实际上涉及。

有什么SMART方式(SQL方式)可以解决这个问题吗?

P.S 暂时我已经解决了这个问题,只是通过查询按 min_price (ASC/DESC) 排序并应用 LIMIT 1,然后从项目记录本身收集所需的值,但我对这个解决方案非常不满意, 所以我决定在这里问一下。

谢谢

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;

关于mysql - 在 MySQL 中选择 MIN 值后选择 MIN (MAX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21815521/

相关文章:

php - mysql如何将同一个表的一个字段的数据复制到另一个字段

mysql - Scala Slick 分页编译,但在运行时崩溃

php - Magento 后端自定义地址属性

mysql - 选择行 (“YYYYMMDD” 字符串格式)<= 今天

c - linux:select的第一个参数

php - 将 php 函数转换为 pdo 函数

mysql - 按 SQL IN() 子句中值的顺序排序

sql - 抑制 sqlplus 中变量替换的输出

mysql - 优先于列的条件排序

PostgreSQL 嵌套选择