MariaDB如何使用加权对多个字段进行ORDER BY结果?

问题描述 投票:0回答:2

我在数据库 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 |
+----+------------+---------------------+----------+-----------+

请注意,某些产品可能带有

sold_at
和 NULL 费率。

我目前尝试了多种方法但都没有用,例如:

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
目前也在使用它的日期订购,但我不知道该怎么做)。

sql mariadb sql-order-by
2个回答
0
投票

尝试以下方法

 order by case when sold_at is null then 1 else 0 end, rate desc

0
投票

在 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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.