【问题标题】:MySQL specifying exact order with WHERE `id` IN (...)MySQL 使用 WHERE `id` IN (...) 指定确切顺序
【发布时间】:2011-02-26 20:00:42
【问题描述】:

有没有一种简单的方法可以通过 WHERE id IN (...) 子句分别对 MySQL 结果进行排序? 示例:

SELECT * FROM articles WHERE articles.id IN (4, 2, 5, 9, 3)

返回

Article with id = 4
Article with id = 2
Article with id = 5
Article with id = 9
Article with id = 3

还有

SELECT * FROM articles WHERE articles.id IN (4, 2, 5, 9, 3) LIMIT 2,2

返回

Article with id = 5
Article with id = 9

更新:更具体地说,我想避免篡改 WHERE articles.id IN (4, 2, 5, 9, 3) 中括号中的数据,因为这些 ID 是动态且自动排序的。

【问题讨论】:

    标签: mysql sql-order-by in-clause


    【解决方案1】:

    是的,有点:

    SELECT * FROM articles
    WHERE articles.id IN (4, 2, 5, 9, 3)
    ORDER BY FIND_IN_SET(articles.id, '4,2,5,9,3')
    

    但这是非标准的 SQL,而且有点味道。

    【讨论】:

    • +1 务实的解决方案。而对于“有点味道”的部分。 ;)
    【解决方案2】:

    这对我有用: ORDER BY FIELD(Product.id, 4,9,8,5,3,11,24,16)

    【讨论】:

    • 无论如何,这在我的机器上都有效并且实际上比接受的答案更快。我测试了 1000 条记录,find_in_set 用了 0.03 秒,field 用了 0.02 秒。我想这种差异会随着更大的集合而变得更加明显。我还使用“LIMIT 2”子句进行了测试,find_in_set 实际上需要更长的时间,0.04 秒,而field 仍然需要 0.02 秒。我个人认为 0.02sec 仍然很慢。 OP 应该小心不要传入大型数据集,否则他会受到性能影响!
    【解决方案3】:

    MySQL 仅使用 ORDER BY 进行排序。这就是为什么数据库表具有类似序数列的情况并不少见的原因。

    articles
    +----+------------+-------+
    | id | ordinality | (...) |
    +----+------------+-------+
    |  2 |          2 |    '' |
    |  3 |          5 |    '' |
    |  4 |          1 |    '' |
    |  5 |          3 |    '' |
    |  9 |          4 |    '' |
    +----+------------+-------+
    
    SELECT *
      FROM articles
     WHERE articles.id IN (4, 2, 5, 9, 3)
     ORDER BY articles.ordinality
    

    【讨论】:

      【解决方案4】:

      我认为你做不到。没有“显式”排序; “in”语句只是告诉你要检索什么,并且没有关于排序的信息。

      由于您给出的示例没有明显的顺序,因此最好的办法是在返回结果后在代码中处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        相关资源
        最近更新 更多