是否可以通过"order by"使用预定义的列值(ID)排序mysql,如:order by(ID = 1,5,4,3),所以我会得到记录1,5,4,3订购?
更新:关于滥用mysql ;-)我必须解释为什么我需要这个...
我希望我的记录每5分钟随机更改一次.我有一个cron任务来执行更新表以在其中放入不同的随机排序顺序.只有一个问题!分页.我将有一位访问者来到我的页面,我给他前20个结果.他将等待6分钟并转到第2页,因为排序顺序已经改变,他将得到错误的结果.
所以我想如果他来到我的网站,我把所有的ID都放到了一个会话中,当他在第2页时,即使排序已经改变,他也能获得正确的记录.
有没有其他方法,更好,这样做?
Man*_*ula 173
您可以使用ORDER BY和FIELD功能.请参阅http://lists.mysql.com/mysql/209784
SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)
Run Code Online (Sandbox Code Playgroud)
它使用Field()函数,其中"返回str1,str2,str3,...列表中str的索引(位置).如果未找到str,则返回0"根据文档.实际上,您通过此函数的返回值对结果集进行排序,该函数是给定集合中字段值的索引.
NPE*_*NPE 27
你应该可以使用CASE这个:
ORDER BY CASE id
WHEN 1 THEN 1
WHEN 5 THEN 2
WHEN 4 THEN 3
WHEN 3 THEN 4
ELSE 5
END
Run Code Online (Sandbox Code Playgroud)
Jan*_*aek 16
关于ORDER BY的 mysql的官方文档,有人发布了你可以FIELD用于此事,如下所示:
SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)
Run Code Online (Sandbox Code Playgroud)
这是理论上应该工作的未经测试的代码.
小智 9
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC
Run Code Online (Sandbox Code Playgroud)
例如,如果我有 10 个注册表,这样 ID 1、5、4 和 3 将首先出现,然后其他注册表将出现。
正常展示 1 2 3 4 5 6 7 8 9 10
用这种方式
8 5 4 3 1 2 6 7 9 10
还有另一种解决方法。添加一个单独的表,如下所示:
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;
Run Code Online (Sandbox Code Playgroud)
现在,该表将用于定义您自己的订购机制。
在其中添加您的值:
my_order | my_number
---------+----------
1 | 1
2 | 5
3 | 4
4 | 3
Run Code Online (Sandbox Code Playgroud)
...然后在加入此新表时修改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;
Run Code Online (Sandbox Code Playgroud)
该解决方案比其他解决方案稍微复杂一些,但是使用此解决方案,您不必SELECT在订单标准发生变化时就更改-statement,只需更改订单表中的数据即可。