【问题标题】:Sort by order of values in a select statement "in" clause in mysql按mysql中select语句“in”子句中的值顺序排序
【发布时间】:2011-01-12 04:54:16
【问题描述】:

我正在从具有整数 id 值的大表(数百万行)中选择一组帐户记录。从某种意义上说,作为一个基本的查询。我在做什么我们构建一个大的逗号分隔列表,并将其作为“in”子句传递到查询中。现在结果是完全无序的。我想做的是按照“in”子句中的值的顺序返回结果。

我假设我必须构建一个临时表并改为执行连接,我想避免这种情况,但可能无法做到。

想法?现在查询的大小上限为每个大约 60k,因为我们正试图限制输出大小,但它可能是任意大的,从实际的角度来看,这可能会排除“in”查询,如果不是物理的。

提前致谢。

【问题讨论】:

标签: mysql select


【解决方案1】:

其实这样更好:

SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIELD(id,5,2,6,8,12,1);

这是 FIELD 文档:

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

【讨论】:

  • 如果 in 子句中的值是由查询而不是静态列表生成的怎么办?我们将如何遵循这个命令?
  • @Sumith OP 的整个问题是你已经在 IN 子句中有一个你想要遵循的静态顺序。如果你没有静态订单,那么 ORDEY BY 子句就没有什么可遵循的了。希望这是有道理的
【解决方案2】:

有点诡计……

SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1') DESC;

请注意,find_in_set 中的 ID 列表是一个字符串,所以它被引用了。 另请注意,如果没有 DESC,它们的结果将按列表指定的反向顺序返回。

【讨论】:

    【解决方案3】:

    如果您的查询是 60K,则表明您的操作方式错误。

    除了使用 ORDER BY 子句之外,没有其他方法可以对结果集进行排序。通过再次列出 IN 子句中的所有元素,您可以在订单中有一个复杂的 CASE 子句,但是您的查询可能是 120K。

    我知道您不想这样做,但是您应该将 IN 子句中的值放在一个表或临时表中并加入它。您还可以在临时表中包含一个 SortOrder 列,并按此排序。像联接这样的数据库。这样做将有助于您的查询执行良好。

    【讨论】:

      【解决方案4】:

      这是我为 mysql 8.0 得到的。这似乎与上述答案相反。

      按照与指定列表相同的顺序排序:

      SELECT * FROM your_table
      WHERE id IN (5,2,6,8,12,1)
      ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1');
      

      按照指定的列表逆序排序:

      SELECT * FROM your_table
      WHERE id IN (5,2,6,8,12,1)
      ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1') DESC;
      

      【讨论】:

        【解决方案5】:

        您的第一个查询肯定使用 order by 子句。所以,你可以只做一个连接,并使用相同的 order by 子句。

        例如,如果这是您的第一个查询

        选择客户 ID 来自客户 WHERE customer_id BETWEEN 1 和 100 命令 通过姓氏

        这是您的第二个查询

        选择inventory_id 从出租 WHERE customer_id in (...有序列表...)

        合并为

        选择 r.inventory_id 从出租r 内 加入客户c ON r.customer_id = c.customer_id C.customer_id 介于 1 和 100 之间的位置 命令 通过 c.last_name

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-28
          • 1970-01-01
          • 2010-12-07
          • 2011-08-31
          • 2014-11-30
          • 2012-01-05
          • 2017-02-21
          相关资源
          最近更新 更多