【问题标题】:" where in " mysql clause"where in" mysql 子句
【发布时间】:2010-11-30 06:10:10
【问题描述】:

我使用了一个 mysql 查询,其中有 "where id in ("22,20,21") " 但是当我得到结果时,它的类似数组按升序排列,即 20,21,20

但我需要它的顺序与我给出子句的顺序相同

【问题讨论】:

标签: php mysql


【解决方案1】:

认为你应该可以像这样使用 FIELD 关键字:

SELECT * FROM table
WHERE id in (22,20,21)
ORDER BY FIELD(id,22,20,21);

这是特定于 mysql 的,看起来很神奇,但它确实有效。

【讨论】:

  • 解释一些魔法......这里发生的是FIELD函数在传递给它的剩余参数中查找id,并返回一个数字。所以如果 id=22,FIELD(...) 返回 0,如果 id=20,则返回 1。
  • @Michal Kopinsky,我从来没有真正找到关于这个功能的好文档。愿意分享你的魔法知识来源吗? ;)
  • @nathan 就在这里:dev.mysql.com/doc/refman/5.1/en/…
  • 这甚至不是我要找的东西,但对一个很棒的小提示表示敬意。
【解决方案2】:

除非给出明确的顺序,否则 SQL 结果是无序的;订单不会从in 子句中提取。

由于 ID 既不是 ASC 也不是 DESC,你必须ORDER BY 别的东西; 22、20、21的顺序你是怎么确定的?

【讨论】:

  • select id,dets from details where id in(22,21,20,19)
  • 我正在从其他表中获取该 ID,该表是一个映射表
  • 这在mysql中其实不是这样的。
  • 对于 MySQL 特定的解决方案,请参阅下面的 @nathan 的答案。对于一个通用的解决方案,就像@deceze 说的那样,也许将两个查询合并为一个并按映射表排序。
  • @Anish 不确定“递归调用”是什么意思。如果您可以更详细地描述您的情况,我相信我们可以提出一个优雅的查询。先发制人:请使用任何新信息更新您的问题。
【解决方案3】:

如前所述...WHERE 子句对结果集的排序没有任何作用。在ORDER BY 子句中使用MySQL built-in FIELD function 来指定结果集的排序方式:

... WHERE id IN (22, 20, 21) ORDER BY FIELD(id, 22, 20, 21) ...

【讨论】:

    【解决方案4】:

    您不能指定将在WHERE 子句中返回的订单结果。如果要指定顺序,则需要在查询中添加 ORDER BY 子句。有关使用 FIND_IN_SET 的解决方案,请参阅 this answer

    【讨论】:

      【解决方案5】:

      一般来说,数据库系统会以任何感觉的顺序返回结果。如果你想订购它,你必须告诉它。 This blog post 提供了一种方法;您也许可以在网上找到其他解决方案。

      【讨论】:

        猜你喜欢
        • 2010-12-07
        • 2012-07-19
        • 1970-01-01
        • 2020-10-13
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 2011-05-16
        相关资源
        最近更新 更多