sql自定义排序

j9per5c4  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(466)

我有一个名为tasks的表,如下所示。表中的字段是雇员、任务和日期。
输入表:

Date:       employees   Task
2016-12-03  John    Paint the walls pink
2016-12-03  Sam     Play hockey on linoleum
2016-12-03  John    the golden fish in a bucket
2016-12-03  Sam     Create a rink on the porch
2016-12-03  Nathan  Glue the front door
2016-12-03  Nathan  Paint the walls pink
2016-12-08  Sam     Melt the doorknob
2016-12-08  Dewey   Wrap the cat in toilet paper
2016-12-08  John    Give bubble gum to the dog
2016-12-08  Dewey   Order 20 pizzas
2016-12-09  John    Create a rink on the porch
2016-12-09  Nathan  Eat all the candies
.......
...... so on

对于输出,我想选择一个列表,该列表首先根据日期排序,然后根据员工的特定顺序排序(john come first,nathan second,sam third,dewey fourth)。

Output:
    Date:       employees   Task
    2016-12-03  John    Paint the walls pink
    2016-12-03  John    the golden fish in a bucket
    2016-12-03  sam     Play hockey on linoleum
    2016-12-03  Sam     Create a rink on the porch
    2016-12-03  Nathan  Glue the front door

..
..
.... so on.

我试着用order by。如何按上述特定顺序进行排序?或者我需要知道其他的概念吗?任何帮助都将不胜感激。

qq24tv8q

qq24tv8q1#

你可以用 FIELD() 功能。该函数的详细信息如下:

FIELD(str,str1,str2,str3,...)

返回str1,str2,str3。。。列表。如果找不到str,则返回0。
现在 FIELD(employees, 'John', 'Nathan', 'Sam', 'Dewey') 如果 employees 不在 ('John', 'Nathan', 'Sam', 'Dewey') .
所以,如果我们使用 ORDER BY FIELD(employees, 'John', 'Nathan', 'Sam', 'Dewey') 只有其他不匹配的行才会出现在顶部。所以,我们可以用 If() 函数为其他不匹配行返回1,为匹配行返回0。
现在,我们可以通过 FIELD(employees, 'John', 'Nathan', 'Sam', 'Dewey') . 这将确保匹配的id按照中指定的顺序首先出现 Field() 功能。
尝试:

SELECT * 
FROM your_table 
ORDER BY `date` ASC, 
          IF(FIELD(employees, 'John', 'Nathan', 'Sam', 'Dewey') = 0, 1, 0) ASC, 
          FIELD(employees, 'John', 'Nathan', 'Sam', 'Dewey') ASC
nafvub8i

nafvub8i2#

你可以用 FIELD() 功能:

SELECT * 
FROM your_table 
ORDER BY `date` ASC, FIELD(employees, 'John', 'Nathan', 'Sam', 'Dewey')

唯一的警告是如果你还有其他员工。以上逻辑将把它们放在首位。
所以,你可能会想要:

SELECT * 
FROM your_table 
ORDER BY `date` ASC,
          COALESCE(NULLIF(FIELD(employees, 'John', 'Nathan', 'Sam', 'Dewey'), 0), 999999)

我用的是 COALESCE(NULLIF()) 组合以避免重复员工列表。另一种选择是反向列表:

SELECT * 
FROM your_table 
ORDER BY `date` ASC,
          FIELD(employees, 'Dewey', 'Sam', 'Nathan', 'John') DESC

相关问题