MySQL ORDER BY IN()

78
我有一个包含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

有什么建议吗?也许有一个函数可以做到这一点?

谢谢!


那些数字还有哪些相关数据?这可能会给我们一些线索,为什么你想按那个顺序排列它们。 - Randell
4个回答

166

我认为你可能在寻找函数FIELD,尽管通常被视为字符串函数,但对于数字也可以正常使用!

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

1
没错。我刚在Paul Dubois的MySQL Cookbook中找到了它:SELECT id, name FROM articles WHERE id IN(7,4,21) ORDER BY FIELD(id, 7,4,21)谢谢! - Henk Denneboom
你们这些人真是太快了。;-) - deceze
@Henk,很高兴能帮助到您,但在SO上没有点赞就接受答案是非常奇怪的情况--您为什么不给我点赞呢?-) - Alex Martelli
1
真聪明。我从没想过把FIELD放在WHERE子句之后的任何位置,因为害怕会产生语法错误或数据库会混淆使用哪个“id”。但是,在我的大脑不爆炸之后,这是有意义的。 - Anthony
@Anthony,很高兴能够拓展你的思维——尽管这让我更加困惑,为什么没有人点赞呢!这确实很奇怪... :-)。 - Alex Martelli
现在这是一个一流的解决方案 +1 - Jake N

10

你可以使用FIELD()函数:

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

返回字符串str在str1、str2、str3等列表中的位置(索引)。如果没有找到,则返回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.

您可以在标准SQL中使用CASE col WHEN *1st-val* THEN 1 WHEN *2nd-val* THEN 2 ... END来完成它。 - derobert
1
我并不推荐这样做! - derobert

-2

你只需要按正确的语句顺序编写代码。

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, name FROM articles WHERE id IN(7,4,21) ORDER BY id 应该显示 7,4,21。但实际上它会显示:4,7,21... - Henk Denneboom
2
联合体不保证顺序。 - paxdiablo
因此,我的第二次尝试会得到所需的“顺序”,但并不是最好的选择。 - Oliver Friedrich
我认为你误解了我的评论,@BeowulfOF。 SQL规范中没有任何内容表明id=1的行会在id=2之前返回。 UNION只是联合选择,而不能控制它们出现的顺序。 - paxdiablo
不太对,Pax,我的回答是针对Henks的评论的。算了,我没有明确写出来。 - Oliver Friedrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接