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