MySQL按特定ID值排序


95

是否可以使用预定义的一组列值(ID)按“ order by”在mysql中排序,例如:order by(ID = 1,5,4,3),因此我会在其中得到记录1、5、4、3订购吗?

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

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

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

还有其他更好的方法吗?


您是否在问mysql是否可以以某种特定顺序进行排序?
stefgosselin 2011年

1
听起来您的数据模型已损坏/不完整(此命令来自何处?),或者您正在滥用MySQL。
derobert

Answers:


202

您可以使用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”。因此,实际上您是根据此函数的返回值(即给定集中字段值的索引)对结果集进行排序。


我似乎无法在不使用以下代码的情况下使其正常工作:WHERE ID IN(1,5,4,3)
TV-C-15,

如何将其与None值一起使用?
诺诺伦敦

30

您应该可以使用CASE此功能:

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

18

在有关ORDER BY的 mysql官方文档上,有人发布了可以FIELD用于此问题的信息,例如:

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

从理论上讲,这是未经测试的代码。


7
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


好的,谢谢您的建议
Bruno Mangini Alves

6

还有另一种解决方法。添加一个单独的表,如下所示:

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无需在订单标准发生变化时就更改-语句-只需更改订单表中的数据即可。


0
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

2
您能进一步解释吗?这看起来与已接受的答案相似,但我认为这ASC OR DESC不是正确的语法
Nico Haase

@NicoHaase ASC和DESC之间的区别是,如果您使用asc,则将在字段函数中使用的id结尾;如果您使用DESC,则将在字段函数中的id首先出现
Hisham shahid

@NicoHaase您可以使用ASC或DESC来查询符合要求的查询
Hisham shahid

因此,您不能在一个查询中同时使用两者。我认为Nico建议您在语法上使答案正确。我敢肯定,他熟悉ASD和DESC的实际含义:)
RiggsFolly,

0

如果您需要首先在结果中订购一个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

添加更多描述
Mathews Sunny Sunny'3

如果您只想对一个ID使用order by,则使用第一个查询;如果您要对多个ID使用,则使用第二个查询
Rajesh Kharatmol,

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

2
尝试在代码中添加一些解释,这将使您的答案更加清晰和易于理解。请阅读stackoverflow.com/help/how-to-answer
32cupo

如果您只想使用一个ID来订购(例如:您希望最后一个“其他”选项,而所有城市列表都按字母顺序显示。),则可以使用此查询。它为我工作。
Preeti
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.