ORDER BY 多变量

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

我想找到一种方法来按照特定的顺序显示我的用户。

  • 首先是热门女性(bool)
  • 然后,最近登记的女性(日期_登记)
  • 然后,趋势公(bool)。
  • 然后,最近登记的男性(日期_登记)
id | sex    | trending | date_registered
---+--------+----------+----------------
1  | male   | 1        | 29-04-2020
2  | male   | 1        | 28-04-2020
3  | male   | 0        | 27-04-2020
4  | female | 1        | 26-04-2020
5  | female | 1        | 25-04-2020
6  | female | 0        | 24-04-2020
7  | female | 0        | 23-04-2020
8  | male   | 1        | 22-04-2020
9  | male   | 0        | 21-04-2020

到目前为止,我能够显示趋势用户,然后使用这个查询显示最近注册的用户。

SELECT *
FROM users
ORDER BY users.trending DESC, users.date_registered DESC

但我需要找到一种方法来分离男性和女性。

这就是我想要的输出顺序。

id | sex    | trending | date_registered | order_wanted
---+--------+----------+-----------------+-------------
1  | male   | 1        | 29-04-2020      | 5
2  | male   | 1        | 28-04-2020      | 6
3  | male   | 0        | 27-04-2020      | 8
4  | female | 1        | 26-04-2020      | 1
5  | female | 1        | 25-04-2020      | 2
6  | female | 0        | 24-04-2020      | 3
7  | female | 0        | 23-04-2020      | 4
8  | male   | 1        | 22-04-2020      | 7
9  | male   | 0        | 21-04-2020      | 9
sql pdo
1个回答
0
投票

如果我的逻辑正确的话,你的条件可以简化为三个排序键。

  • 趋势第一
  • 那么性别
  • 然后date_registered

您可以使用 row_number():

select u.*,
       row_number() over (order by trending desc, gender asc, date_registered desc) as ord
from users u

注意: order 是一个非常糟糕的列名,因为它是一个SQL关键字。

如果你不想要一个单独的列,那么只需要使用下面的 order by 为整个查询。

order by trending desc, gender asc, date_registered desc

0
投票

试着用下面的查询。

SELECT *
FROM users
ORDER BY date_registered desc, sex, trending;
© www.soinside.com 2019 - 2024. All rights reserved.