【问题标题】:avoid Sorting by the MYSQL IN Keyword避免按 MYSQL IN 关键字排序
【发布时间】:2011-05-10 21:16:22
【问题描述】:

当查询 db 以获取一组 id 时,mysql 不会按照指定 id 的顺序提供结果。我正在使用的查询如下:

SELECT id ,title, date FROM Table WHERE id in (7,1,5,9,3)

作为回报,提供的结果按 1、3、5、7、9 的顺序排列。

如何避免这种自动排序

【问题讨论】:

  • 我曾经收到我公司一位开发人员的请求,我只是回复Seems you have the precise information of 7,1,5,9,3, why you still need to sort it again ???
  • @ajreal 我从另一台服务器获取这些 ID。 n 我需要按相关顺序查询数据库。我不想对其进行排序,数据库以排序方式返回..我想避免排序:)
  • .. ARGGGGG...你已经在7,1,5,9,3的ORDER中有这些ID,为什么还要重新排序??两个解决方案,query one id by idOr use a place holder array that is your original order and fetch the results from database in whatever order, loop the place holder array and set it accordingly。你已经有了鸡,为什么还想知道鸡蛋是怎么下的?

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


【解决方案1】:

没有自动排序或默认排序。您看到的排序很可能是表中行的自然排序,即。它们被插入的顺序。如果您希望以其他方式对结果进行排序,请使用ORDER BY 子句指定它。 SQL 中无法指定排序顺序应遵循IN 子句中的项目顺序。

【讨论】:

  • 更准确地说,没有办法在 WHERE 子句中指定排序。
  • @JonhFx:+1 感谢您扩大我的发言范围。
  • 阅读问题,在您的查询中尝试。当您指定 in 关键字时,它会排序。无论如何。我只是在最后添加了 ORDER BY FIELD(id, {values}),然后它工作..
  • @Nauman Bashir:我确实重新阅读了这个问题并坚持我的回答。没有ORDER BY,就不会进行排序。您将按照它们碰巧出现在表中的顺序返回结果,在您的情况下,这恰好是 id 列的升序。但在一般情况下,这根本不是真的。无论如何,您使用ORDER BY FIELD 的解决方案是一个不错的解决方案。坚持下去。
【解决方案2】:

如果您想按照in clause 中指定的顺序通过id 对结果进行排序,您可以使用FIND_IN_SET 作为:

SELECT id ,title, date 
FROM Table 
WHERE id in (7,1,5,9,3)
ORDER BY FIND_IN_SET(id,'7,1,5,9,3')

【讨论】:

  • 创意解决方案。这可能在大型集上表现良好吗?
  • 我认为我发现此解决方案存在潜在问题。如果列表包含两位数并且搜索恰好是两位数的子字符串的一位数会产生错误的索引怎么办?在那种情况下似乎它会被打破。
  • @Asaph:它适用于大型集,well 部分需要查看。关于您的第二条评论:我已经在两位数上尝试过,它似乎工作正常。
  • 我现在明白,由于逗号是字符串中的分隔符,它可以处理两位数。我是通过阅读文档得到的:dev.mysql.com/doc/refman/5.0/en/…
  • 好吧,我使用 ORDER BY FIELD(id, {values})。它工作但我唯一的问题是性能问题。
【解决方案3】:

SQL 中的WHERE 子句不影响排序顺序; ORDER BY 子句就是这样做的。

如果您没有使用ORDER BY 指定排序顺序,SQL 将选择自己的顺序,这通常是主键的顺序,但也可以是任何顺序。

如果您希望记录按特定顺序排列,则需要指定 ORDER BY 子句,告诉 SQL 您想要的顺序。

如果您想要的顺序仅基于奇怪的 ID 序列,那么您需要在 ORDER BY 子句中指定它。确切地指定它会很棘手。这是可能的,但需要一些笨拙的 SQL 代码,并且会显着降低查询速度(因为它不再使用键来查找记录)。

如果您想要的 ID 序列是因为其他一些更可预测的因素(例如,您实际上想要按名称字母顺序排列的记录),您可以执行 ORDER BY name(或任何字段)。

如果您真的想按任意顺序按 ID 排序,您可能需要生成一个临时字段,您可以使用该字段进行排序:

SELECT *,
CASE id
  WHEN 7 THEN 1
  WHEN 1 THEN 2
  WHEN 5 THEN 3
  WHEN 3 THEN 4
  WHEN 9 THEN 5
END AS mysortorder
FROM mytable
WHERE id in (7,1,5,9,3)
ORDER BY mysortorder;

【讨论】:

  • 好吧..感谢您的信息..但我正在运行时生成查询..所以这会有点长..我刚刚添加了 ORDER BY FIELD(id, {values})在查询结束时.. 我只是担心性能问题
【解决方案4】:

您看到的行为是查询优化的结果,我希望您在 id 上有一个索引,以便 IN 语句将使用该索引以最有效的方式返回记录。由于未指定 ORDER BY 语句,数据库将假定返回记录的顺序并不重要,并将优化速度。 (结帐“解释选择”)

CodeAddicts 或 Spudley 的回答会给出您想要的结果。另一种方法是为“mytable”(或另一个表)中的 id 分配优先级,并使用它来根据需要对记录进行排序。

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 2019-11-20
    • 2015-09-12
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多