Mysql按特定ID值排序

时间:2011-11-30 08:09:37

标签: mysql sorting

是否可以使用预定义的一组列值(ID)按“order by”排序mysql:order by(ID = 1,5,4,3)所以我会得到记录1,5,4,按顺序排出3?

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

我希望我的记录每5分钟随机更改一次。我有一个cron任务来执行更新表以在其中放入不同的随机排序顺序。只有一个问题!分页。我将有一位访问者来到我的页面,我给他前20个结果。他将等待6分钟并转到第2页,因为排序顺序已经改变,他将得到错误的结果。

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

有没有其他方法,更好,这样做?

8 个答案:

答案 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