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 值排序的主要内容,如果未能解决你的问题,请参考以下文章