2013-10-16 155 views
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") 

是否有任何方法根据我的自定义顺序对查询结果进行排序?

+0

这个[page](http://stackoverflow.com/a/6332081/2145211)看起来像你的解决方案 – Harrison

+0

你可以放置你的表的show create statements en show索引和关于你的数据的一些信息..就像if a.bla只包含'1'或'0'?并且http://sqlfiddle.com/上的一些示例数据会很好,如果sqlfiddle再次运行.. –

+0

@RaymondNijland更新了问题并包含表格模式 – user2636556

回答

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 5IN子句中的ID已经被限制他们。

+1

+1使用'IN'代替了一堆'OR'比较。 – tadman

+0

@RaymondNijland你有更好的解决方案吗?因为我的桌子很大。我有大约100k行 – user2636556

+0

@ user2636556没有使用mysql1或PDO和准备语句,那么你可以停止一阶SQL注入,但二次注入仍然是可能的..注意mysql_ *函数将在未来从PHP中删除.. –