MySQL : ORDER BY 表达式?
MySQL : ORDER BY expression?
在一个网站上,我有一个项目列表,我很难用 MySQL 对其进行排序。
有些项目是 "expired"(他们的 end_at 是过去的),我想找回它们,但是在 "active" 项目之后(他们的 end_at 可以是 NULL 或将来的)。
我希望能够根据另一个字段对项目进行进一步排序,比方说 "views"(首先获得最受欢迎的)
基本上,这就是我想要得到的:
- 项目 1(活跃 - 最受欢迎)
- 项目 2(活跃 - 第二受欢迎)
- 项目 3(活跃 - 第 3 受欢迎)
- 项目 4(已过期)
- 项目 5(已过期)
- (以此类推)
到目前为止,这是我尝试过的:
SELECT name, end_at
FROM items
ORDER BY (end_at IS NULL OR end_at > CURDATE()), views DESC;
不起作用:即使是第一个退回的商品也已过期。
我刚刚找到了一个方法:
SELECT *
FROM items
ORDER BY CASE
WHEN (end_at IS NULL OR end_at > CURDATE())
THEN 0
ELSE 1
END, views DESC;
根据表达式,CASE WHEN 影响每一行的值。排序像往常一样,使用这个计算值。
你快明白了。 MySQL returns 0
或 1
中的条件。由于 0
出现在 1
之前,您必须对 desc
进行排序
SELECT name,end_at FROM items
ORDER BY (end_at IS NULL OR end_at > CURDATE()) DESC,
views DESC;
或否定条件以获得所需的结果
SELECT name,end_at FROM items
ORDER BY end_at IS NOT NULL AND end_at < CURDATE() ASC,
views DESC;
在一个网站上,我有一个项目列表,我很难用 MySQL 对其进行排序。
有些项目是 "expired"(他们的 end_at 是过去的),我想找回它们,但是在 "active" 项目之后(他们的 end_at 可以是 NULL 或将来的)。
我希望能够根据另一个字段对项目进行进一步排序,比方说 "views"(首先获得最受欢迎的)
基本上,这就是我想要得到的:
- 项目 1(活跃 - 最受欢迎)
- 项目 2(活跃 - 第二受欢迎)
- 项目 3(活跃 - 第 3 受欢迎)
- 项目 4(已过期)
- 项目 5(已过期)
- (以此类推)
到目前为止,这是我尝试过的:
SELECT name, end_at
FROM items
ORDER BY (end_at IS NULL OR end_at > CURDATE()), views DESC;
不起作用:即使是第一个退回的商品也已过期。
我刚刚找到了一个方法:
SELECT *
FROM items
ORDER BY CASE
WHEN (end_at IS NULL OR end_at > CURDATE())
THEN 0
ELSE 1
END, views DESC;
根据表达式,CASE WHEN 影响每一行的值。排序像往常一样,使用这个计算值。
你快明白了。 MySQL returns 0
或 1
中的条件。由于 0
出现在 1
之前,您必须对 desc
SELECT name,end_at FROM items
ORDER BY (end_at IS NULL OR end_at > CURDATE()) DESC,
views DESC;
或否定条件以获得所需的结果
SELECT name,end_at FROM items
ORDER BY end_at IS NOT NULL AND end_at < CURDATE() ASC,
views DESC;