根据自定义订单返回结果

时间:2013-10-16 16:36:46

标签: 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, 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")

有没有办法根据我的自定义顺序对查询结果进行排序?

1 个答案:

答案 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已经是限制他们。