2

我正在尝试根据 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")

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

4

1 回答 1

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功能的更多信息,请查看官方文档

澄清一下,当您应用函数、case 语句或在ORDER BY子句中使用字段本身以外的内容时,您将无法在该字段上使用索引(如果有)。此外,您正在添加要在该字段上执行的额外计算,这也需要时间来执行。您将不得不接受这样一个事实,即这确实会导致查询的性能低于使用ORDER BY a.id. 但是,很明显后者不能满足自定义排序的要求。

无论如何,当您首先通过只有 5 个结果的主键进行过滤时,您最多会匹配这 5 个结果。在不使用索引的情况下订购 5 个结果是微不足道的,应该在几毫秒内解决。现在,您添加到IN子句的 id 越多,您必须订购的记录就越多。如果这个数字变为significative,那么查询将开始运行得更慢。您必须根据您的硬件和软件配置进行测试,这对significative您的情况意味着什么。

PS:我刚刚意识到 asid最有可能是主键,那么您就不需要了LIMIT 5,因为子句中的 idIN已经限制了它们。

于 2013-10-16T16:40:29.080 回答