我正在尝试基于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, 1, 300
我尝试了以下查询,但无效。
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")
有没有办法根据我的自定义顺序对查询结果进行排序?
答案 0 :(得分:3)
试试这个:
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)
有关FIELD
功能的详细信息,请查看official documentation。
只是澄清一下,当您应用函数,case语句或在ORDER BY
子句中使用字段本身以外的其他内容时,您将失去在该字段上使用索引(如果有)的能力。此外,您还要在字段上添加额外的计算,这也需要时间来执行。您将不得不接受这样的事实:与使用ORDER BY a.id
的查询相比,这确实会导致性能较低的查询。但是,很明显,后者无法满足自定义排序的要求。
无论如何,由于您首先使用只有5个结果的主键进行过滤,因此您最多只能匹配这5个结果。在不使用索引的情况下排序5个结果是微不足道的,应该是
在几毫秒内解决。现在,您添加到IN
子句的ID越多,您需要订购的记录就越多。如果此数字变为significative
,则查询将开始变慢。您必须根据您的硬件和软件配置进行测试significative
在您的情况下的含义。
PS:我刚刚意识到由于id
最有可能是主键,因此您不需要LIMIT 5
,因为IN
子句中的ID已经是限制他们。