具有特定值的ORDER BY优先级

时间:2013-08-07 20:11:32

标签: mysql

我的表格中有一个名为 role 的列,其值如下:

Scientific staff
PostDocs
Supporting staff
PNUT
Visiting researchers
Secretary
Ph.D. students
Students
Other

我想以{strong>科学人员排在第一位的方式使用ORDER BY。在我进行这样的查询时, Ph.D的字段。学生将首先返回(因为目前数据库中的行没有包含其他的字段)。有没有办法只使用mysql来实现这一点,还是应该手动修改返回的值?如果是的话,你能告诉我怎么样吗?

SELECT * FROM members ORDER BY role

2 个答案:

答案 0 :(得分:2)

正如目前所实施的那样,你不能以科学人员为先的方式进行排序,因为做奥得河按照相关项目的顺序对其进行排序(在你的情况下,按字母顺序排列,按角色出现) )。

现在,对此的简单解决方案是构建一个包含其中值的排序优先级表,分配数字优先级,然后按优先级排序。让我解释一下,因为它可能令人困惑:

您创建第二个表,列出其中的每个角色,并在第二列中为这些角色提供将显示的优先级。

表: 角色|优先

科学人员| 1

博士生| 2

其他| 3 (等)

然后你可以做这样的事情(伪MySQL):

 select members.role from members
 inner join priority
 on members.role = priority.role
 order by priority.priority

将为您提供members表中的role字段,该字段按您在优先级表上设置的优先级排序。由于它是内部联接,任何没有角色的人都不会显示。

答案 1 :(得分:2)

你可以在没有附加表的情况下进行加入,只需执行:

SELECT * FROM members 
ORDER BY
  CASE role
     WHEN 'Scientific staff' THEN 1
     WHEN 'PostDocs'         THEN 2
     WHEN 'Supporting staff' THEN 5
     WHEN 'PNUT'             THEN 6
     WHEN 'Visiting researchers' THEN 4
     WHEN 'Secretary'        THEN 3
     WHEN 'Ph.D. students'   THEN 8
     WHEN 'Students'         THEN 7
     WHEN 'Other'            THEN 9
     ELSE   10
  END