Mysql 按特定 ID 值排序

Posted

技术标签:

【中文标题】Mysql 按特定 ID 值排序【英文标题】:Mysql order by specific ID values 【发布时间】:2012-01-09 12:08:58 【问题描述】:

是否可以使用预定义的一组列值 (ID) 按“排序依据”在 mysql 中排序,例如:排序依据 (ID=1,5,4,3) 所以我会得到记录 1、5、4, 3 在那个顺序?

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

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

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

还有其他更好的方法吗?

【问题讨论】:

你是在问mysql有没有办法可以不按特定顺序排序? 听起来您的数据模型已损坏/不完整(此订单来自哪里?),或者您正在滥用 MySQL。 【参考方案1】:

您应该可以为此使用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】:

在mysql的官方文档上关于ORDER BY,有人发帖说这个问题可以使用FIELD,像这样:

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

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

【讨论】:

【参考方案3】:

您可以使用 ORDER BY 和 FIELD 功能。 见http://lists.mysql.com/mysql/209784

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

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

【讨论】:

如果不使用,我似乎无法让它工作:WHERE ID IN (1,5,4,3) 你将如何使用 None 值?【参考方案4】:

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

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

【讨论】:

【参考方案5】:
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

【讨论】:

【参考方案6】:

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

【讨论】:

添加更多描述 如果您只想对一个 id 使用 order by,则使用第一个查询,如果您想要多个 id,则使用第二个查询【参考方案7】:
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

【讨论】:

您能进一步解释一下吗?这看起来与接受的答案相似,但我认为ASC OR DESC 的语法不正确 @NicoHaase ASC 和 DESC 之间的区别在于,如果您使用 asc,那么您在字段函数中使用的 id 将排在最后,如果您使用 DESC,那么字段函数中的 id 将首先出现 @NicoHaase 您可以根据要求将 ASC 或 DESC 与查询一起使用 因此您不能在一个查询中同时使用两者。我认为 Nico 是在建议您在语法上正确地回答您的问题。我很确定他熟悉 ASD 和 DESC 的实际含义:) 这毫无意义,绝对行不通。您需要使用 FIELD 函数,该函数与 8 年前接受的答案相同。【参考方案8】:

如果您想在结果中最后排序单个 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

【讨论】:

尝试在你的代码中添加一些解释,它会让你的答案更加清晰易懂。请阅读***.com/help/how-to-answer 如果您只想对一个 id 使用 order by(例如:您希望在最后一个“其他”选项并且所有城市列表按字母顺序显示。)所以您可以使用此查询。它对我有用。

以上是关于Mysql 按特定 ID 值排序的主要内容,如果未能解决你的问题,请参考以下文章

按特定字段值排序

如何在 Redshift ORDER BY 子句中首先按特定值排序?

mysql 根据某字段特定值排序

如何对mySQL数据库中某些特定字段进行排序?

求mysql 语句去重并按重复个数排序

MySQL group_concat() 按 case 语句值排序