查询按照aplhabetic命令检索记录,但必须在顶部的n个预定义项目除外

时间:2014-08-18 15:58:11

标签: mysql sql sql-order-by

我需要检索按字母顺序排序的所有记录。 之外,对于预定义的记录列列表,其记录应首先按给定的预定义顺序显示,则所有其他记录应按字母顺序排列,基于同一列

例如,假设我们有下表,称为Names

enter image description here
假设预定义列表为("Mathew", "Ashraf", "Jack")
即这些是他们的记录应首先按预定顺序列出的名称。

因此所需的查询结果应为:

enter image description here

哪个查询可以检索此自定义订单?
P.S,我正在使用MySQL。


这是根据评论请求进行的试用:

(SELECT * FROM Names WHERE Name in ('Mathew', 'Ashraf', 'Jack')) 
UNION 
(SELECT * FROM Names WHERE Name NOT IN ('Mathew', 'Ashraf', 'Jack') ORDER BY Name ASC);

第一个查询结果未按要求排序。

enter image description here

2 个答案:

答案 0 :(得分:2)

如果你想要Mathew,Ashraf和Jack在内部订购,你可以使用类似的东西:

select id, name, case name when 'Mathew' then 1
                           when 'Ashraf' then 2
                           when 'Jack'   then 3
                           else 4
                 end as x
from T
order by x, name

如果首先排序的是谁并不重要:

select id, name, case when name in ('Mathew', 'Ashraf', 'Jack') 
                      then 0 else 1 
                 end as x
from T
order by x, name

答案 1 :(得分:2)

 DROP TABLE IF EXISTS my_table;

 CREATE TABLE my_table
 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,name VARCHAR(12) NOT NULL UNIQUE
 );

 INSERT INTO my_table (name) VALUES
 ('Sam'),
 ('John'),
 ('Samanta'),
 ('Johny'),
 ('Ashraf'),
 ('Tom'),
 ('Jack'),
 ('Mathew'),
 ('Hans'),
 ('Adam');


 SELECT * FROM my_table ORDER BY FIELD(name,'Jack','Ashraf','Mathew') DESC,name;
 +----+---------+
 | id | name    |
 +----+---------+
 |  8 | Mathew  |
 |  5 | Ashraf  |
 |  7 | Jack    |
 | 10 | Adam    |
 |  9 | Hans    |
 |  2 | John    |
 |  4 | Johny   |
 |  1 | Sam     |
 |  3 | Samanta |
 |  6 | Tom     |
 +----+---------+

你甚至可以使用FIND_IN_SET ...

 SELECT * FROM my_table ORDER BY FIND_IN_SET(name,'Jack,Ashraf,Mathew') DESC,name;