首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据列值获取最小值行

根据列值获取最小值行
EN

Database Administration用户
提问于 2018-02-09 09:32:45
回答 1查看 362关注 0票数 1

我有下面的表,其中存储了我的产品价格和我的产品的特殊价格数据。我想从下面的数据中得到最便宜的产品。

代码语言:javascript
运行
复制
+------+-------+---------------+-------------------+-----------------+
|  id  | price | special_price | special_from_date | special_to_date |
+------+-------+---------------+-------------------+-----------------+
| 2647 |   299 |           251 | NULL              | NULL            |
| 2648 |   299 |            85 | 2017-12-29        | 2018-02-28      |
| 2649 |   299 |          NULL | 2017-12-29        | 2018-02-28      |
| 2650 |   299 |            55 | 2017-12-29        | 2018-01-01      |
| 2651 |   299 |           179 | 2017-12-29        | NULL            |
+------+-------+---------------+-------------------+-----------------+

这里棘手的部分是,我想检查下面的条件。

  1. 检查price栏中的最低产品价格。
  2. 跳过special_price如果NULL
  3. 跳过special_price,如果special_from_datespecial_to_dateNULL,或者当前日期不在范围内
  4. 检查special_price列,如果special_from_date不是NULL,而special_from_date小于当前日期,而special_to_dateNULL或大于当前日期。

输出如下所示。

代码语言:javascript
运行
复制
+------+-------+---------------+-------------------+-----------------+
|  id  | price | special_price | special_from_date | special_to_date |
+------+-------+---------------+-------------------+-----------------+
| 2648 |   299 |            85 | 2017-12-29        | 2018-02-28      |
+------+-------+---------------+-------------------+-----------------+

这是我的表模式。

代码语言:javascript
运行
复制
+------------------------+---------------------+------+-----+---------+-------+
| Field                  | Type                | Null | Key | Default | Extra |
+------------------------+---------------------+------+-----+---------+-------+
| id                     | int(10) unsigned    | NO   | PRI | NULL    |       |
| price                  | decimal(12,4)       | YES  |     | NULL    |       |
| special_price          | decimal(12,4)       | YES  |     | NULL    |       |
| special_from_date      | date                | YES  |     | NULL    |       |
| special_to_date        | date                | YES  |     | NULL    |       |
+------------------------+---------------------+------+-----+---------+-------+
EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-02-10 02:39:03

按以下方式获得当前价格:

在下列情况下使用special_price

  1. special_price不为空
  2. special_from_date不为空
  3. special_from_date并不比今天更大
  4. 下列操作之一应用(或条件)
    • special_to_date为空(打开)
    • special_to_date不少于当前日期

否则使用(默认) price

因为如果一方为NULL,则比较将“失败”,因此(2)与(3)是冗余的,因此可以跳过。

为了避免OR-条件,(4)可以表示为coalesce(special_to_date, curdate()) >= curdate().

代码语言:javascript
运行
复制
select p.*,
  case
    when  special_price is not null -- 1
      and curdate() >= special_from_date -- 2 and 3
      and curdate() <= coalesce(special_to_date, curdate()) -- 4
    then special_price
    else price
  end as current_price
from prices p
order by current_price asc
limit 1

演示:http://rextester.com/ETEU48971

请注意,如果要将special_from_datespecial_to_date包括在范围内,则不太清楚。在这种情况下,它们被包括在内。如果要将它们排除在外,可以使用:

代码语言:javascript
运行
复制
      and curdate() > special_from_date
      and curdate() < coalesce(special_to_date, curdate() + interval 1 day)
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/197478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档