是否可以使用预定义的一组列值(ID)按“order by”排序mysql:order by(ID = 1,5,4,3)所以我会得到记录1,5,4,按顺序排出3?
更新:关于滥用mysql ;-)我必须解释为什么我需要这个......
我希望我的记录每5分钟随机更改一次。我有一个cron任务来执行更新表以在其中放入不同的随机排序顺序。只有一个问题!分页。我将有一位访问者来到我的页面,我给他前20个结果。他将等待6分钟并转到第2页,因为排序顺序已经改变,他将得到错误的结果。
所以我认为,如果他来到我的网站,我把所有的ID都放到一个会话中,当他在第2页时,即使排序已经改变,他也能得到正确的记录。
有没有其他方法,更好,这样做?
答案 0 :(得分:153)
您可以使用ORDER BY和FIELD功能。 见http://lists.mysql.com/mysql/209784
SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)
它使用Field()函数,其中“返回str1,str2,str3,...列表中str的索引(位置)。如果未找到str,则返回0”根据文档。所以实际上你通过这个函数的返回值对结果集进行排序,这是给定集合中字段值的索引。
答案 1 :(得分:28)
您应该可以使用CASE
:
ORDER BY CASE id
WHEN 1 THEN 1
WHEN 5 THEN 2
WHEN 4 THEN 3
WHEN 3 THEN 4
ELSE 5
END
答案 2 :(得分:14)
在有关ORDER BY的mysql的官方文档中,有人发布了您可以使用FIELD
来解决此问题,如下所示:
SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)
这是理论上应该有效的未经测试的代码。
答案 3 :(得分:5)
还有另一种解决方法。添加一个单独的表,如下所示:
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;
此表现在将用于定义您自己的订单机制。
在那里添加您的值:
my_order | my_number
---------+----------
1 | 1
2 | 5
3 | 4
4 | 3
...然后在加入这个新表时修改您的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;
此解决方案比其他解决方案稍微复杂一些,但使用此解决方案时,只要订单标准发生变化,您就不必更改SELECT
- 语句 - 只需更改订单表中的数据即可。
答案 4 :(得分:3)
SELECT * FROM table ORDER BY id ='8'DESC,id ='5'DESC,id ='4'DESC,id ='3'DESC
如果我有10个注册管理机构,那么首先会出现ID 1,5,4和3,其他注册管理机构将会出现。
正常的展示 1 2 3 4 五 6 7 8 9 10
用这种方式
8 五 4 3 1 2 6 7 9 10
答案 5 :(得分:1)
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC
答案 6 :(得分:0)
如果要在结果中最后排序单个ID,请根据情况使用排序。 (例如:您希望最后一个“其他”选项和所有城市列表按字母顺序显示。)
select id,city
from city
order by case
when id = 2 then city else -1
end, city ASC
例如,如果我有5个城市,则我想按字母顺序显示城市,并在下拉菜单中最后显示“其他”选项,那么我们可以使用此查询。 看到其他示例在我的表中第二个id(id:2)处显示,因此我在上面的查询中使用“ when id = 2”。
记录在数据库表中:
Bangalore - id:1
Other - id:2
Mumbai - id:3
Pune - id:4
Ambala - id:5
我的输出:
Ambala
Bangalore
Mumbai
Pune
Other
答案 7 :(得分:-1)
如果您需要首先在结果中订购单个ID,请使用ID。
select id,name
from products
order by case when id=5 then -1 else id end
如果需要以多个ID序列开头,请指定一个集合,类似于在IN
语句中使用的集合。
select id,name
from products
order by case when id in (30,20,10) then -1 else id end,id