MySQL ORDER BY IN()


69

我有一个带有ID编号的PHP数组。这些号码已经订购。

现在,我想通过IN()方法获取我的结果,以获取所有ID。

但是,这些ID的排序应类似于IN方法。

例如:

IN(4,7,3,8,9)  

应该给出如下结果:

4 - Article 4  
7 - Article 7  
3 - Article 3  
8 - Article 8  
9 - Article 9

有什么建议?也许有一个功能可以做到这一点?

谢谢!


与这些数字相关的其他数据是什么?它可以为我们提供一个线索,说明您为什么要按此顺序。
兰德尔尔

Answers:


151

我认为您可能正在寻找函数FIELD-虽然通常认为它是字符串函数,但它也适用于数字!

ORDER BY FIELD(field_name, 3,2,5,7,8,1)

1
究竟。我只是在看Paul Dubois的MySQL Cookbook,发现了它:SELECT ID,从文章中获得的名称,ID为IN(7,4,21)ORDER BY FIELD(id,7,4,21)谢谢!
Henk Denneboom 09年

该死的人快。;-)
deceze

@Henk,很乐意为您提供帮助,但是不接受投票是在SO上发生的一种特殊现象-您是否不赞成我?-)
Alex Martelli,2009年

1
那真的很聪明。我不会考虑将FIELD放在WHERE子句之后的任何地方,因为它会引发语法错误,或者数据库会混淆使用哪个“ id”。但这在我的大脑未爆炸之后是有道理的。
安东尼

@Anthony很高兴扩大了您的大脑-尽管这对我来说是一个越来越深和更黑暗的奥秘,这就是为什么没人支持的原因!
Alex Martelli,2009年

9

您可以使用FIELD()

ORDER BY FIELD(id, 3,2,5,7,8,1)

返回str在str1,str2,str3,...列表中的索引(位置)。如果找不到str,则返回0。

不过,这有点丑陋,因此只有在没有其他选择的情况下才真正使用它。在您的应用中对输出进行排序可能会更好。


0

标准SQL没有提供执行此操作的方法(MySQL可以,但我更喜欢与供应商无关的解决方案,因此我可以随时切换DBMS)。

返回结果集,这是您应该在后处理中执行的操作。SQL只能按“ order by”子句中指定的顺序返回它们(如果没有这样的子句,则可以按任何顺序返回)。

另一种可能性(尽管我不喜欢,但我很荣幸为您提供选择)是多次访问数据库,每个ID一次,并在它们进入时对其进行处理:

select * from tbl where article_id = 4;
// Process those.
select * from tbl where article_id = 7;
// Process those.
: : : : :
select * from tbl where article_id = 9;
// Process those.

您可以使用CASE col WHEN *1st-val* THEN 1 WHEN *2nd-val* THEN 2 ... END
-derobert,

1
...不是我会推荐这样的东西!
derobert

-3

您只需要按语句给出正确的顺序即可。

SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID

您为什么要像示例中那样使数据无序排序?

如果您不介意连接长查询,请尝试以下方式:

SELECT ID FROM myTable WHERE ID=1
UNION
SELECT ID FROM myTable WHERE ID=3
UNION
SELECT ID FROM myTable WHERE ID=2

谢谢。但这并不能解决问题:SELECT ID,来自ID为ID IN(7,4,21)的文章的名称ORDER BY ID应该显示7,4,21。但取而代之的是:4,7,21 ...
Henk Denneboom 09年

2
联盟并不能保证秩序。
paxdiablo

正确,因此,我的第二个镜头会发出想要的“命令”,但这并不是最甜蜜的事情。
奥利弗弗里德里希

我认为您误解了我的评论@BeowulfOF。SQL规范中没有任何内容表明id = 1行将在id = 2行之前返回。UNION只是
合并

不太可能,Pax,我的回答是针对Henks的评论。没关系,我没有明确地写它。
奥利弗·弗里德里希
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.