2012-04-15 65 views
1

我有这个订单 - 由问题我canot裂纹。我从我的桌面上选择这样的:mysql order-by original“where order”

SELECT * FROM 'sidemodules' WHERE name = 'module1' OR name = 'module2' OR 'name3' 

这将返回我想要的模块。但是这些模块位于手术台,说在这个顺序:

  1. 单词数
  2. 模块1
  3. 模块2

而且他们在这个顺序返回给我。我怎样才能让他们按顺序显示在哪里(1,2,3)?

非常感谢!

回答

2

我认为你正在寻找FIELD

SELECT * FROM sidemodules 
WHERE name IN ('module1', 'module2', 'name3') 
ORDER BY FIELD(name, 'module1', 'module2', 'name3') 

无论如何,如果名称是按字母顺序只需使用:

ORDER BY name 

还要注意的是使用IN运营商通常比快只是使用很多OR s。

+0

谢谢您的回答,这是最有用的! Codigniter实现如果任何人有兴趣,可以在这里找到:[链接](http://www.simonemms.com/2011/04/07/codeigniter-activerecord-order-by-field/) – 2012-04-16 09:33:19

0

我认为你在你的问题中有一个错字。你的最后一个条件应该是name = 'module3',而不是仅仅name3

请尝试以下方法:

SELECT * 
FROM 'sidemodules' 
WHERE name = 'module1' OR name = 'module2' OR name = 'module3' 
ORDER BY name; 
+0

不,代码是罚款,我的帖子马虎:S;) – 2012-04-16 09:34:26

0

如果你有一个固定的顺序,你可以用一个CASE语句中的顺序:

SELECT * FROM 'sidemodules' 
WHERE name = 'module1' 
    OR name = 'module2' 
    OR name = 'module3' 
ORDER BY CASE 
    WHEN name = 'module1' THEN 1 
    WHEN name = 'module3' THEN 2 
    WHEN name = 'module2' THEN 3 
ELSE '0' 
END 
1

你需要按子句顺序使用FIELD。 returnset将与您编写的订单相同。

SELECT * FROM sidemodules 
WHERE name IN ('module1', 'module2', 'name3') 
ORDER BY FIELD(name, 'module1', 'module2', 'name3') 

结果: 模块1,模块2,NAME3

SELECT * FROM sidemodules 
WHERE name IN ('module1', 'module2', 'name3') 
ORDER BY FIELD(name, 'module2', 'module1', 'name3') 

结果: 模块2,模块1,NAME3

+0

谢谢你的回答。 – 2012-04-16 09:33:36