如何按IN子句的顺序选择mysql行

时间:2011-02-13 20:38:50

标签: sql mysql sql-order-by

例如我在表EMPLOYEE:

(code, name)
(1, 'Jimmy')
(2, 'Albert')
(3, 'Michelle')
(4, 'Felix' )

如果您这样做:(从EMPLOYEE中选择*),您将获得:

(1, 'Jimmy')
(2, 'Albert')
(3, 'Michelle')
(4, 'Felix' )

如果您这样做:(从EMPLOYEE中选择*,您将获得(1,3,2,4)中的代码:

(1, 'Jimmy')
(2, 'Albert')
(3, 'Michelle')
(4, 'Felix' )

如何按IN子句中的CSV值顺序获取它,按原样?

(1, 'Jimmy')
(3, 'Michelle')
(2, 'Albert')
(4, 'Felix' )

2 个答案:

答案 0 :(得分:18)

使用FIND_IN_SET function

SELECT e.* 
  FROM EMPLOYEE e 
 WHERE e.code in (1,3,2,4) 
ORDER BY FIND_IN_SET(e.code, '1,3,2,4')

或使用CASE声明:

SELECT e.* 
  FROM EMPLOYEE e 
 WHERE e.code in (1,3,2,4) 
ORDER BY CASE e.code
           WHEN 1 THEN 1 
           WHEN 3 THEN 2
           WHEN 2 THEN 3
           WHEN 4 THEN 4
         END

答案 1 :(得分:1)

此问题的一般解决方案是保留基于输入(CSV)文件的订单,即在表格中添加AUTO_INCREMENT列,并根据该列进行排序。您可能永远不会将其显示为查询的一部分,但您可以在导入后在其上订购以获取输入文件中的原始订单。