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
)

感谢您的帮助,解决方案有效,但速度很慢,也许以后会找到更好的东西,无论如何都感谢

4

5 回答 5

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

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

与使用 CASE 或一些 ID=x, ID=y ...

于 2013-03-17T01:32:01.147 回答
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
于 2013-03-17T01:06:34.907 回答
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到每个条件。

于 2013-03-17T01:03:24.470 回答
1

http://sqlfiddle.com/#!2/40b299/6

我认为这就是您正在寻找的 :D 适应您自己的情况。

于 2013-03-17T01:55:22.673 回答
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 TempTable.OrderID
  1. 删除临时表(同样,在存储过程中的 SQL 中,这是自动的,不确定 MySql 所以在此提及以进行全面披露)

这有效地避免了您在表中没有键来订购的问题......您创建了一个。应该管用。

于 2013-03-17T01:20:38.763 回答