Mysql 返回基于自定义订单的结果
我正在尝试根据ID做一个简单的搜索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
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我刚刚删除了所有(我的)注释,因为它们似乎比它们帮助其他人的内容更令人困惑。我已经用这些评论的摘要更新了答案。请删除您的评论。谢谢