如何获取分类1、2、3的最低价格?SQL查询求助
按分类获取最低价格问题
需要获取分类1、2、3的最低价格,规则为:每条记录中若price_reduced不为0,则取该记录price与price_reduced的较小值;若price_reduced为0,则直接取price,最终按分类取所有记录的最低值。
已尝试的SQL语句
LEAST(MIN(price_reduced),MIN(price)) IFNULL(MIN(price_reduced),MIN(price)) ... WHERE price <> 0 and price_reduced <> 0
数据库表结构及数据
| id | category | price | price_reduced |
|---|---|---|---|
| 1 | 1 | 200 | 100 |
| 2 | 1 | 300 | 0 |
| 3 | 1 | 500 | 0 |
| 4 | 2 | 200 | 150 |
| 5 | 2 | 125 | 0 |
| 6 | 3 | 300 | 0 |
| 7 | 3 | 200 | 90 |
期望输出
1 - 100 2 - 125 3 - 90
解决方案
之前的写法存在两个核心问题:
- 过滤条件
price <> 0 and price_reduced <> 0会排除price_reduced为0的记录,导致这些记录的price无法参与最低值计算 - 直接对分类的
MIN(price_reduced)和MIN(price)取最小值,逻辑错误——应该先计算单条记录的有效低价,再按分类聚合取最小值
标准格式输出SQL
SELECT category, MIN(CASE WHEN price_reduced > 0 THEN LEAST(price, price_reduced) ELSE price END) AS lowest_price FROM your_table_name WHERE category IN (1,2,3) GROUP BY category ORDER BY category;
匹配期望格式的SQL
如果需要直接输出分类 - 价格的字符串格式,使用以下语句:
SELECT CONCAT(category, ' - ', MIN(CASE WHEN price_reduced > 0 THEN LEAST(price, price_reduced) ELSE price END)) AS result FROM your_table_name WHERE category IN (1,2,3) GROUP BY category ORDER BY category;
逻辑说明
- 用
CASE语句处理单条记录的有效价格:当price_reduced大于0时,取该记录两个价格的较小值;否则直接使用price - 按
category分组后,用MIN()聚合函数获取每个分类的最低有效价格 - 通过
WHERE category IN (1,2,3)限定只查询目标分类
内容的提问来源于stack exchange,提问作者Aziz IMStorm
相关产品推荐
相关产品推荐

