按相同列的多个值排序结果

时间:2017-02-14 18:32:16

标签: mysql

我有一个查询,可以根据标题从数据库中获取联系人。它会查找多个标题,如果从同一个查询中返回多个联系人,我希望它们按特定顺序排列。这就是我的意思:

这是表格的一个例子:

id   | name      | title              | email
-----+-----------+--------------------+------------------
1    | Bob       | General Manager    | bob@example.com
2    | John      | President          | john@example.com
3    | Sue       | Owner              | sue@example.com

我的查询是这样的:

SELECT * FROM tbl_contacts WHERE title IN ('General Manager', 'Owner', 'President')

如何使查询以特定顺序(或我的标题中的标题层次结构)返回结果?

我希望始终保持顺序的结果:

  1. 总经理
  2. 所有者
  3. 会长
  4. 例如,如果没有该实体的总经理,我仍然希望保持相同的层次结构并返回:

    1. 所有者
    2. 会长

3 个答案:

答案 0 :(得分:4)

您想使用FIELD功能。它返回给定字符串集中搜索字符串的位置。

select *
from tbl_contacts
where title in ('General Manager', 'Owner', 'President')
order by field(title, 'General Manager', 'Owner', 'President')

答案 1 :(得分:1)

在您的情况下,简单的ORDER BY可以执行此操作:

SELECT * FROM tbl_contacts 
WHERE title IN ('General Manager', 'Owner', 'President')
ORDER BY title ASC

另一种方式,如果标题不是按字母顺序排列的,您可以使用FIELD使用以下内容:

SELECT * FROM tbl_contacts 
WHERE title IN ('General Manager', 'Owner', 'President')
ORDER BY FIELD(title, 'General Manager', 'Owner', 'President')

答案 2 :(得分:1)

设置您自己的订单:

SELECT * FROM tbl_contacts 
WHERE title IN ('General Manager', 'Owner', 'President')
ORDER BY CASE
              WHEN title = 'Owner' THEN 0
              WHEN title = 'President' THEN 1
              WHEN title = 'General Manager' THEN 2
          END