我想知道是否有办法(可能是更好的方法)按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也有哪些选项可能会很有用。
发布于 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()
函数中,这将执行您想要的操作。
发布于 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
发布于 2008-12-28 23:19:39
脑海中浮现出两个解决方案:
order by case id when 123 then 1 when 456 then 2 else null end asc
order by instr(','||id||',',',123,456,') asc
(instr()
来自Oracle;您可能有locate()
或charindex()
或类似的东西)
https://stackoverflow.com/questions/396748
复制相似问题