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

Posted

技术标签:

【中文标题】在 MySQL 中选择 MIN 值后选择 MIN (MAX)【英文标题】:SELECT MIN (MAX) after SELECTING MIN value in MySQL 【发布时间】:2014-02-16 18:27:43 【问题描述】:

我有两张表:itemsprices(一对多)

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

首先,我在获取所有商品时遇到了问题,并预先计算了默认价格与其压倒一切的当前价格(如果有的话?)之间的 MINIMUM PRICE - MIN。

你可以在这里看到它:http://sqlfiddle.com/#!2/f31d5/25

幸运的是,感谢 ***(你可以在这里看到它: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/MAX 不适用于 JOIN em> 或 GROUP BY)。

还有一件事需要注意 - 我正在为我的搜索系统编写这个,这只是其中的一小部分,所以,“WHERE”子句在那里也很重要,因为并非所有项目都实际参与。

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

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

谢谢

P.P.S 完全忘了提,我无法避免这个 SQL 查询,因为我有一个分页系统,实际上附加了 LIMIT X,OFFSET Y。所以,我需要选择全局值,而不仅仅是特定页面!

【问题讨论】:

您想要所有商品中价格最低的一排吗?还是每件商品的最低价格? MIN_PRICE 最小的一行,前一步计算出来的 【参考方案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;

【讨论】:

不幸的是,我知道。主要是因为我有分页系统。所以,我需要一个纯 SQL 的解决方案。 像魅力一样工作!高超!谢谢!顺便说一句,您能解释一下,为什么在查询末尾需要一个“p”文字? @Dmitri 存在“p”文字,因为每个表都必须具有唯一的名称。在这种情况下,子查询是(临时)表。

以上是关于在 MySQL 中选择 MIN 值后选择 MIN (MAX)的主要内容,如果未能解决你的问题,请参考以下文章

如何仅为以前记录中未选择为 MIN 的值选择 MIN?

MySQL MIN/MAX 所有行

从多列中选择 MAX 和 MIN

如何在 sql 中设置变量并在选择查询中使用它来显示和执行对该变量的操作(MAX MIN)?

从连接表中选择 min

如何从另一个表中选择 MIN 和 MAX