MySql 按特定 ID 值排序

有没有可能在 MySQL 中使用一组预定义的列值(ID)(如 order by (ID=1,5,4,3))按“ order by”进行排序,这样我就可以按这个顺序得到记录1、5、4、3?

更新: 为什么我需要这个..。

我希望我的记录每5分钟随机更改一次排序。我有一个 cron 任务来更新表,以便将不同的随机排序顺序放入其中。

There is just one problem! PAGINATION.

我会有访客谁来到我的网页,我会给他们的前20个结果。他们将等待6分钟,转到第2页,并有错误的结果,因为排序顺序已经改变。

所以我认为,如果我把所有的 ID 放到第2页的一个会话中,即使排序已经改变,我们也能得到正确的记录。

Is there any other 好多了 way to do this?

110176 次浏览

您应该能够使用 CASE来完成以下任务:

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

在 mysql 关于 订购人的官方文档中,有人发帖说你可以使用 FIELD来解决这个问题,比如:

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

这是未经测试的代码,理论上应该可以工作。

可以使用 ORDERBY 和 FIELD 函数。 请参见 http://lists.mysql.com/mysql/209784

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

它使用 字段()函数,该函数“返回 str1、 str2、 str3、 ... 列表中 str 的索引(位置)。如果没有找到 str,返回0”。所以实际上你可以通过这个函数的返回值对结果集进行排序,返回值就是给定集合中字段值的索引。

还有另一种解决方法,添加一个单独的表,比如:

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;

此表现在将用于定义您自己的订购机制。

Add your values in there:

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语句,只需更改订单表中的数据即可。

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 5 6 7 8 9 10

用这种方式

8 5 4 3 1 2 6 7 9 10

如果需要在结果中首先排序一个 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
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

如果希望在结果中排序最后一个 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