2013-03-17 25 views
4

我有简单的查询:MySQL的ORDER BY为了

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

的问题是,我怎么能选择喜欢在我的我的数据和命令它。

订单必须是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的帮助,解决工作,但速度很慢,也许找到更好后来,感谢名单反正

+0

它不是自然顺序吗? – Sebas 2013-03-17 01:06:36

+0

@ Sebas no - 如果没有'order by'设置,那么没有默认的订购 – 2013-03-17 01:07:22

+0

但是这就是他想要的,据我了解 – Sebas 2013-03-17 01:07:51

回答

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

+0

我觉得你不能在他的情况下真的那样做,显然IN子查询的值在他的产品中没有硬编码。 environnement – Sebas 2013-03-17 01:06:11

+0

@Sebas他总是可以通过编程的方式创建'ORDER BY'以及我看到的 – 2013-03-17 01:06:41

+0

,但如果有1000个结果呢?这不是有点矫枉过正吗? – Sebas 2013-03-17 01:07:32

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 
+0

漂亮和紧凑 – 2013-03-17 01:07:15

+1

@PreetSangha你认为这比我的答案更紧凑? – 2013-03-17 01:28:04

+0

其实没有。我更喜欢你的 – 2013-03-17 01:30:35

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这样提的充分披露)

这有效地规避了您不是有问题在你的桌子上点餐的关键......你创建一个。应该管用。

+1

他主要关心的是速度,这不会帮助 – 2013-03-17 01:21:35

+0

是的,速度就是一切,thanx帮忙。 – swamprunner7 2013-03-17 01:22:25

+0

这是最动态的方式,我认为,但绝对不是最快的方式,尤其是在我刚刚读取的MySql中不支持表变量(很烂!) – 2013-03-17 01:31:56

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 ...

+0

非常好,但文件也是,也许我从来没有这样做没有文件。谢谢。 – swamprunner7 2013-03-17 01:38:48