我在数据库 toto 上有一个
products
表,看起来像这样:
MariaDB [toto]> desc products;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| product_id | int(11) | NO | | NULL | |
| sold_at | datetime | YES | | NULL | |
| rate | int(11) | YES | | NULL | |
| name | varchar(128) | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+
现在承认我有这些数据:
MariaDB [toto]> select * from products;
+----+------------+---------------------+----------+-----------+
| id | product_id | sold_at | rate | name |
+----+------------+---------------------+----------+-----------+
| 1 | 400 | 2023-04-14 07:28:44 | NULL | product_1 |
| 2 | 399 | NULL | 728 | product_2 |
| 3 | 401 | 2023-04-14 07:28:44 | 100000 | product_3 |
| 4 | 398 | NULL | 99999999 | product_4 |
| 5 | 404 | 2023-04-14 07:45:00 | 1 | product_5 |
+----+------------+---------------------+----------+-----------+
5 rows in set (0.001 sec)
我的目标是按
rate
DESC 对所有这些结果进行排序,所有产品的 sold_at
值首先不为空,这意味着我想让我所有的非空 sold_at
等于 1 和空 sold_at
到0。
看起来像:
+----+------------+---------------------+----------+-----------+
| id | product_id | sold_at | rate | name |
+----+------------+---------------------+----------+-----------+
| 3 | 401 | 2023-04-14 07:28:44 | 100000 | product_3 |
| 5 | 404 | 2023-04-14 07:45:00 | 1 | product_5 |
| 1 | 400 | 2023-04-14 07:28:44 | NULL | product_1 |
| 4 | 398 | NULL | 99999999 | product_4 |
| 2 | 399 | NULL | 728 | product_2 |
+----+------------+---------------------+----------+-----------+
请注意,某些产品可能带有
和 NULL 费率。sold_at
WITH data AS (SELECT * FROM products ORDER BY rate DESC) SELECT * FROM data ORDER BY sold_at;
SELECT * FROM products ORDER BY rate DESC, sold_at ASC;
我知道为什么那行不通(因为
sold_at
目前也在使用它的日期订购,但我不知道该怎么做)。
尝试以下方法
order by case when sold_at is null then 1 else 0 end, rate desc
在 MariaDB 中,我们可以这样表述:
select *
from mytable
order by (sold_at is null), rate desc
在
order by
子句的上下文中,谓词 sold_at is null
如果为真则评估为 1
,如果为假则评估为 0
- 因此这将非空值放在第一位。
id | product_id | 已售出 | 率 | 姓名 |
---|---|---|---|---|
3 | 401 | 2023-04-14 07:28:44 | 100000 | product_3 |
5 | 404 | 2023-04-14 07:45:00 | 1 | product_5 |
1 | 400 | 2023-04-14 07:28:44 | 空 | product_1 |
4 | 398 | 空 | 99999999 | product_4 |
2 | 399 | 空 | 728 | product_2 |