MySQL按顺序排序

时间:2013-03-17 00:56:18

标签: mysql sql-order-by

我有简单的查询:

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
)

Thanx提供帮助,解决方案有效,但速度非常慢,可能会在以后找到更好的东西,但不管怎么说

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

可能更容易自动生成(因为它基本上只需要以相同的顺序再次插入所需的ID),而不是使用CASE建议的其他解决方案或ID = x,ID = y。 ..

答案 3 :(得分:1)

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

我认为这就是你要找的东西:D根据你自己的情况调整它。

答案 4 :(得分:0)

要动态执行此操作,并在MySql中,我建议执行以下操作:

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

    2. 在此临时表上为您的查询添加JOIN

    3. 将您的订单更改为

    4. order by TempTable.OrderID
      
      1. 删除临时表(再次,在存储过程中的SQL中,这是自动的,不确定MySql所以在此提及完全公开)
      2. 这有效地避免了你在桌子上没有钥匙的问题......你创造了一个。应该工作。