MySQL中按照IN顺序排序

4

我有一个简单的查询:

SELECT data FROM table WHERE id IN (5, 2, 8, 1, 10)

问题在于,我如何选择我的数据并按照IN语句中的顺序进行排序。
顺序应为5、2、8、1、10。
问题是我没有可用于排序的键。IN数据来自其他查询(1),但我需要保持其原有的顺序。
有解决方案吗?
(1)
SELECT login 
FROM posts 
    LEFT JOIN users ON posts.post_id=users.id 
WHERE posts.post_n IN (
    2280219,2372244, 2345146, 2374106, 2375952, 2375320, 2371611, 2360673, 2339976, 2331440, 2279494, 2329266, 2271919, 1672114, 2301856
)

谢谢你的帮助,解决方案有效但速度很慢,也许以后可以找到更好的方案,无论如何还是谢谢。


这不是自然而然的顺序吗? - Sebas
@Sebas 不是的 - 如果没有设置 order by,那么就没有默认排序。 - Matt Busche
但就我理解,那正是他想要的。 - Sebas
@swamprrunner7,你能展示一下其他的查询吗?它是单独的还是与你的代码结合在一起的? - Sebas
就像这样 SELECT login FROM posts LEFT JOIN users ON(posts.post_id=users.id) WHERE posts.post_n IN (2280219, 2372244, 2345146, 2374106, 2375952, 2375320, 2371611, 2360673, 2339976, 2331440, 2279494, 2329266, 2271919, 1672114, 2301856) - swamprunner7
显示剩余3条评论
5个回答

1
我能想到的按任意列表排序的唯一方法是对该列表中的每个项进行比较并使用ORDER BY。虽然这样做很丑陋,但它可以工作。您最好在进行选择的代码中进行排序。
SELECT data FROM t1 WHERE id IN (5, 2, 8, 1, 10)
ORDER BY id = 10, id = 1, id = 8, id = 2, id = 5

订单被颠倒是因为否则您需要将DESC添加到每个条件中。

我认为在他的情况下你无法真正做到这一点,显然IN子查询的值在他的生产环境中并没有硬编码。 - Sebas
@Sebas 他也可以通过编程方式动态创建 ORDER BY - Explosion Pills
我了解,但如果有1000个结果怎么办?这不会有点过头了吗? - Sebas
@Sebas 可能是这样,但不幸的是我认为没有其他办法。 - Explosion Pills
它的效果很好,但现在使用了慢的文件排序,这很糟糕。无论如何,谢谢。 - swamprunner7

1
你可以使用CASE语句。
SELECT data 
FROM table WHERE id IN (5, 2, 8, 1, 10)
ORDER BY CASE WHEN id = 5 THEN 1 WHEN id = 2 THEN 2 WHEN id = 8 THEN 3 WHEN id = 1 THEN 4 WHEN id = 10 THEN 5 END

1
@PreetSangha,你认为这个比我的答案更紧凑吗? - Explosion Pills

1

非常好,但是需要使用文件排序,也许我没有办法在没有文件排序的情况下完成。谢谢。 - swamprunner7

1

0

要动态地在MySql中进行此操作,我建议按照以下方式操作:

  1. 创建一个临时表或表变量(不确定MySql是否有这些),包含两列:
OrderID mediumint not null auto_increment
InValue mediumint -(or whatever type it is)
  1. 按顺序插入IN子句的值,这将按插入顺序生成ID

  2. 在查询中添加一个JOIN到临时表

  3. 将您的Order By更改为

order by TempTable.OrderID
  1. 删除临时表(在存储过程中的SQL中,这是自动完成的,不确定MySql是否也是如此,因此在此进行全面披露)

这有效地规避了您在表中没有排序键的问题...您可以创建一个。应该可以工作。


1
他的主要关注点是速度,这不会有所帮助。 - Matt Busche
是的,速度很重要,感谢您的帮助。 - swamprunner7
这是我认为最动态的方式,但绝对不是最快的方式,特别是在 MySql 中,我刚刚读到它不支持表变量(糟糕!) - Dmitriy Khaykin
使用内存存储引擎来创建临时表能否使其运行速度足够快?http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html。 - Chuan Ma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接