我有下表,用于存储我的产品价格和特价数据。我想从以下数据中获得价格最低的产品。
+------+-------+---------------+-------------------+-----------------+
| 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 |
+------+-------+---------------+-------------------+-----------------+
这里棘手的部分是我想检查以下条件。
- 检查
price
最低产品价格栏。 - 跳过
special_price
如果NULL
special_price
如果special_from_date
和special_to_date
是NULL
或当前日期不在范围内则跳过- 检查
special_price
列是否special_from_date
不是NULL
并且special_from_date
小于当前日期并且special_to_date
大于NULL
或等于当前日期。
输出将如下所示。
+------+-------+---------------+-------------------+-----------------+
| id | price | special_price | special_from_date | special_to_date |
+------+-------+---------------+-------------------+-----------------+
| 2648 | 299 | 85 | 2017-12-29 | 2018-02-28 |
+------+-------+---------------+-------------------+-----------------+
这是我的表架构。
+------------------------+---------------------+------+-----+---------+-------+
| 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 | |
+------------------------+---------------------+------+-----+---------+-------+
请记住,如果 CURDATE() 不适合任何日期范围,您将不会获得任何行。
dbfiddle在这里
获取当前价格如下:
使用
special_price
时:special_price
不为空special_from_date
不为空special_from_date
不比今天大special_to_date
为 NULL(打开)special_to_date
不早于当前日期否则使用(默认)
price
。由于如果一侧为 NULL,则比较将“失败”,因此 (2) 与 (3) 是多余的,可以跳过。
为避免 OR 条件,(4) 可表示为
coalesce(special_to_date, curdate()) >= curdate()
。演示:http ://rextester.com/ETEU48971
注意不是很清楚,如果你想包含
special_from_date
和special_to_date
进入范围。在这种情况下,它们包括在内。如果你想排除它们,你可以使用: