如何在ORDER BY ABS中放置一个函数(

时间:2012-08-12 02:00:55

标签: php sql arrays sql-order-by ranking

目前我有一个SQL查询,它查找可接受的匹配项,然后使用以下方法对它们进行排序:

ORDER BY ABS (itemranking - $rating)

是否可以在处理查询时以某种方式修改“项目排名”,以便可以添加类似以下内容的条件:

if (category == '$category')

从项目的ABS中减去1;

然后ORDER BY ABS

我不确定这对于那些知道正确代码的人来说是否是一个快速的答案,或者它是否是一个更大的概念“我怎么能实现这个结果”类型的问题。

无论哪种方式,有一些上下文可能会有所帮助。目标是对一堆提交进行排序,使它们匹配值“rating”,同时也提升用户正在寻找的类别中的项目。

一个真实的例子(不是我的网站):购物网站可以提供一个过滤器,在价格方面搜索最接近的匹配,但就好像某个类别中的所有项目(例如“红色”)都要接近10美元比实际更匹配。

3 个答案:

答案 0 :(得分:1)

为什么不使用以下类型的SQL,在ORDER BY表达式中使用CASE语句来动态排序结果?

这是一个面向SQL的解决方案,所以我不确定它对您的问题有多适用。

SELECT *
FROM Table
ORDER BY CASE Category 
           WHEN '$category' THEN ABS(ItemRanking - $rating - 1) 
           ELSE ABS(ItemRanking - $rating)
         END

答案 1 :(得分:0)

执行类似

的操作
Select if(category='$category', ABS (itemranking - $rating) - 1, ABS (itemranking - rating)) as calc 
FROM table 
ORDER BY calc

答案 2 :(得分:0)

正如已经提到的,在Select查询中使用测试条件是通过使用Case语句完成的。除了已经给出的示例之外,其他一些代码示例可能是:

Order By ABS (itemranking - $rating) - 
  Case When category == '$category' Then 1 Else 0 End

Order By ABS (Case when category == '$category' then (itemranking - $rating - 1)
  Else (item - $rating) End)

此外,您没有提及您是使用MySQL还是MS-SQL Server或其他一些sql-server。一些可以与MySQL正常工作的东西可能不适用于MS-SQL Server,反之亦然。