Mysql 返回基于自定义订单的结果

Mysql 返回基于自定义订单的结果,mysql,Mysql,我正在尝试根据ID做一个简单的搜索 SELECT * FROM `test` AS a WHERE a.bla != '1' AND ( a.id = 85355 OR a.id = 85353 OR a.id = 80090 OR a.id = 1 OR a.id = 300 ) LIMIT 0, 5 问题是,根据我的查询,结果没有列出 我希望行顺序如下85355、85353、80090、1300 我尝试了以下查询,但不起作用 SELECT * FROM `te

我正在尝试根据ID做一个简单的搜索

SELECT * FROM `test` AS a
WHERE a.bla != '1' AND (
   a.id = 85355 OR
   a.id = 85353 OR
   a.id = 80090 OR
   a.id = 1 OR
   a.id = 300
)
LIMIT 0, 5
问题是,根据我的查询,结果没有列出

我希望行顺序如下
85355、85353、80090、1300

我尝试了以下查询,但不起作用

SELECT * FROM `test` AS a WHERE a.bla!='1' AND (a.id=85355 OR a.id=85353 OR a.id=80090 OR a.id=1 OR a.id=300) 
ORDER BY IF (FIELD(id, "85355,85353,80090,1,300"), 0, id), FIELD(id, "85355,85353,80090,1,300")
有没有办法根据我的自定义顺序对查询结果进行排序?

试试以下方法:

SELECT * FROM `test` a
WHERE a.bla != '1' AND a.id in (85355, 85353, 80090, 1, 300)
ORDER BY FIELD(a.id, 85355, 85353, 80090, 1, 300)
有关
字段
功能的更多信息,请检查

只是澄清一下,当您在
ORDER BY
子句中应用函数、case语句或使用字段本身以外的内容时,您将失去在该字段上使用索引(如果有)的能力。此外,您正在添加一个要在字段上执行的额外计算,这也需要时间来执行。您必须接受这样一个事实:与使用a.idORDER的查询相比,这确实会导致性能更低的查询。但是,很明显,后者不能满足定制分拣的要求

无论如何,当您第一次使用主键筛选时,只有5个结果,您最多将匹配这5个结果。在不使用索引的情况下对5个结果进行排序很简单,应该 在几毫秒内解决。现在,您向子句中的
添加的ID越多,您需要订购的记录就越多。如果此数字变为有意义的
,则查询将开始缓慢运行。您必须根据您的硬件和软件配置测试
在您的情况下有意义的
意味着什么


PS:我刚刚意识到,由于
id
很可能是主键,因此您不需要
LIMIT 5
,因为
in
子句中的id已经限制了它们。

这看起来像是您的解决方案。您可以将show create语句放在表的show索引中,并显示一些数据信息。。例如,如果a.bla仅包含“1”或“0”?如果sqlfiddle再次运行,一些关于的示例数据会很好。@RaymondNijland更新了问题并包含了表schema@RaymondNijland你有更好的解决办法吗?因为我的桌子很大。我大约有10万rows@user2636556如果不使用mysql1或PDO和prepared语句,那么您可以停止一阶sql注入,但二阶注入仍然是可能的。。注:mysql_*函数将在将来从PHP中删除。@Mosty Mostacho很好地解释了执行。。。但是在索引字段上使用计算/函数很可能会使索引变得无用。@user2636556我刚刚删除了所有(我的)注释,因为它们似乎比它们帮助其他人的内容更令人困惑。我已经用这些评论的摘要更新了答案。请删除您的评论。谢谢