Mysql按特定ID值sorting

是否有可能通过“order by”使用预定义的列值(ID)来对mysql进行sorting:order by(ID = 1,5,4,3)所以我会得到logging1,5,4,3为了?

更新:关于滥用MySQL ;-)我必须解释为什么我需要这个…

我希望我的logging每5分钟随机更改一次。 我有一个cron任务来做更新表,把不同的随机sorting顺序。 只有一个问题! 分页。 我将有一个访客来到我的页面,我给他的前20个结果。 他将等待6分钟,然后转到第2页,因为sorting顺序已经改变,他将得到错误的结果。

所以我想,如果他来我的网站,我把所有的ID都放到一个会话中,当他在第2页时,即使sorting已经改变,他也会得到正确的logging。

有没有其他办法,更好地做到这一点?

您可以使用ORDER BY和FIELDfunction。 请参阅http://lists.mysql.com/mysql/209784

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3) 

它使用Field()函数,其中“返回str1,str2,str3,…列表中的str的索引(位置)。根据文档,返回0如果str未find”。 所以实际上,您可以使用该函数的返回值对结果集进行sorting,该函数是给定集中字段值的索引。

你应该能够使用CASE

 ORDER BY CASE id WHEN 1 THEN 1 WHEN 5 THEN 2 WHEN 4 THEN 3 WHEN 3 THEN 4 ELSE 5 END 

在关于ORDER BY的官方文档中,有人发布说你可以使用FIELD来处理这个问题,就像这样:

 SELECT * FROM table ORDER BY FIELD(id,1,5,4,3) 

这是理论上应该起作用的未经testing的代码。

还有另一种方法来解决这个问题。 添加一个单独的表,如下所示:

 CREATE TABLE `new_order` ( `my_order` BIGINT(20) UNSIGNED NOT NULL, `my_number` BIGINT(20) NOT NULL, PRIMARY KEY (`my_order`), UNIQUE KEY `my_number` (`my_number`) ) ENGINE=INNODB; 

这张performance在将被用来定义您自己的订单机制。

在那里添加你的值:

 my_order | my_number ---------+---------- 1 | 1 2 | 5 3 | 4 4 | 3 

…然后在join这个新表时修改你的SQL语句。

 SELECT * FROM your_table AS T1 INNER JOIN new_order AS T2 on T1.id = T2.my_number WHERE ....whatever... ORDER BY T2.my_order; 

这个解决scheme比其他解决scheme稍微复杂一点,但是使用这个方法,只要您的订单标准发生变化,您就不必更改SELECT语句,只需更改订单表中的数据即可。

SELECT * FROM table ORDER BY id ='8'DESC,id ='5'DESC,id ='4'DESC,id ='3'DESC

例如,如果我有10个registry,那么ID 1,5,4和3将首先出现,其他registry将出现在下一个。

正常展览1 2 3 4 5 6 7 8 9 10

用这种方式

8 5 4 3 1 2 6 7 9 10