【问题标题】:MySQL ORDER BY IN()MySQL ORDER BY IN()
【发布时间】:2026-01-08 11:30:01
【问题描述】:

我有一个 PHP 数组,其中包含多个 ID。这些数字已经订购。

现在我想通过 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

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

谢谢!

【问题讨论】:

  • 与这些数字相关的其他数据是什么?它可能会给我们一个线索,为什么你要按这个顺序。

标签: php mysql sql-order-by in-function


【解决方案1】:

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

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

【讨论】:

  • 没错。我只是在看 Paul Dubois 的 MySQL Cookbook 并找到它:SELECT id, name FROM article WHERE id IN(7,4,21) ORDER BY FIELD(id, 7,4,21) 谢谢!
  • 该死的人速度很快。 ;-)
  • @Henk,很高兴为您提供帮助,但是在 SO 上接受没有赞的情况确实很奇怪——您有什么理由不支持我吗?-)
  • 这真是太聪明了。我不会想到将 FIELD 放在 WHERE 子句之后的任何地方,因为担心它会引发语法错误或者数据库会混淆使用哪个“id”。但这是有道理的,在我的大脑未爆炸之后。
  • @Anthony,很高兴扩展了你的大脑——尽管它只是让我觉得它成为一个更深更暗的谜,为什么没有人支持这个!-) 确实很奇怪...:-)。
【解决方案2】:

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

这是您在返回结果集后后应该做的事情。 SQL 只能按“order by”子句中指定的顺序返回它们(如果没有这样的子句,则按 any 顺序)。

另一种可能性(虽然我不喜欢它,但我很荣幸让您选择)是多次访问数据库,每个 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
  • ...不是我推荐这样的东西!
【解决方案3】:

你可以使用FIELD():

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

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

不过,这有点丑陋,所以只有在别无选择的情况下才使用它。在您的应用中对输出进行排序可能会更好。

【讨论】:

    【解决方案4】:

    您只需要通过语句给出正确的顺序。

    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 article WHERE id IN(7,4,21) ORDER BY id 应该显示 7,4,21。但它会显示:4,7,21...
    • Union 保证订单。
    • 对,因此我的第二个镜头会给出想要的“订单”,但不是最甜蜜的东西。
    • 我认为你误解了我的评论,@BeowulfOF。 SQL 规范中没有任何内容说 id=1 行将在 id=2 行之前返回。 UNION 只是联合选择,它不控制它们进入的顺序。
    • 不完全是,Pax,我的回答是针对 Henks 的评论。没关系,我没有明确写出来。