根据 WHERE IN 子句数据排序结果集

Posted

技术标签:

【中文标题】根据 WHERE IN 子句数据排序结果集【英文标题】:Order resultset based on WHERE IN clause data 【发布时间】:2010-02-11 16:34:40 【问题描述】:

考虑这个 mysql 查询:

SELECT
  someColumns
FROM
  someTable
WHERE
  someColumn IN ( value1, value2, value3 )

...我如何保证行集按照IN () 子句给出的值的确切顺序排序?我认为如果不给它一个ORDER BY 子句,这不能保证,是吗?

PS:IN () 子句的值将是由 php(利用 Zend Framework 的 select 语句)以下列方式传递给查询的任意数据数组:

->where( 'someColumn in (?)', $theArrayWithValues );

【问题讨论】:

【参考方案1】:

在 ORDER BY 中使用 CASE 语句:

ORDER BY CASE someColumn
           WHEN value1 THEN 1
           WHEN value2 THEN 2
           WHEN value3 THEN 3
         END ASC

根据需要分配任意值。我通常不会在ORDER BY 中包含ASC,因为如果未定义它是隐含的,但我想明确说明,以防您想在DESC 顺序中。

【讨论】:

像魅力一样工作。谢谢。 巧妙!谢谢!【参考方案2】:

不,不能保证顺序 - 或者更确切地说,它将是所选行在数据库中出现的顺序。

如果您知道这些值将属于一个严格的集合,您可以按照您想要的顺序将该列设为 ENUM 类型,并且对该字段的排序将按该顺序排序。

按特定值排序的一种简单方法是:

ORDER BY `someColumn`='value1' DESC, `someColumn`='value2' DESC, ...

【讨论】:

以上是关于根据 WHERE IN 子句数据排序结果集的主要内容,如果未能解决你的问题,请参考以下文章

用于返回结果集的 where 子句中的 case 语句包含空值

为啥聚合函数不能放在where后面?

没有 order by 子句的 Oracle 排序结果集

.如何使用UNION子句,它必须符合哪两条基本准则?

SQL - 在 WHERE 子句中使用日期范围的结果集中未显示正确日期

EXISTS 和 IN 的区别