首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >按SQL IN()子句中值的顺序排序

按SQL IN()子句中值的顺序排序
EN

Stack Overflow用户
提问于 2008-12-28 22:09:50
回答 13查看 141.6K关注 0票数 167

我想知道是否有办法(可能是更好的方法)按IN()子句中的值的顺序进行排序。

问题是我有两个查询,一个获取所有is,第二个检索所有信息。第一个方法创建ID的顺序,我希望第二个方法作为排序依据。in以正确的顺序放在IN()子句中。

所以它应该是这样的(非常简单):

SELECT id FROM table1 WHERE ... ORDER BY display_order, name

SELECT name, description, ... WHERE id IN ([id's from first])

问题是第二个查询返回结果的顺序与将ID放入IN()子句的顺序不同。

我找到的一种解决方案是将所有I放入一个带有自动递增字段的临时表中,然后将该字段连接到第二个查询中。

有没有更好的选择?

注意:由于第一个查询是“由用户”运行的,而第二个查询是在后台进程中运行的,因此无法使用子查询将2个查询合并为1个查询。

我使用的是MySQL,但我认为让它知道其他DB也有哪些选项可能会很有用。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2008-12-28 22:25:38

使用MySQL的FIELD()函数:

SELECT name, description, ...
FROM ...
WHERE id IN([ids, any order])
ORDER BY FIELD(id, [ids in order])

FIELD()将返回与第一个参数相等的第一个参数的索引(不同于第一个参数本身)。

FIELD('a', 'a', 'b', 'c')

将返回1

FIELD('a', 'c', 'b', 'a')

将返回3

如果您以相同的顺序将in粘贴到IN()子句和FIELD()函数中,这将执行您想要的操作。

票数 203
EN

Stack Overflow用户

发布于 2011-12-01 17:31:07

请参阅下面的如何获取排序数据。

SELECT ...
  FROM ...
 WHERE zip IN (91709,92886,92807,...,91356)
   AND user.status=1
ORDER 
    BY provider.package_id DESC 
     , FIELD(zip,91709,92886,92807,...,91356)
LIMIT 10
票数 15
EN

Stack Overflow用户

发布于 2008-12-28 23:19:39

脑海中浮现出两个解决方案:

  1. order by case id when 123 then 1 when 456 then 2 else null end asc
  2. order by instr(','||id||',',',123,456,') asc

(instr()来自Oracle;您可能有locate()charindex()或类似的东西)

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/396748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档