如何将函数放入 ORDER BY ABS(.


How can I put a function inside ORDER BY ABS(

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

ORDER BY ABS (itemranking - $rating)

是否可以在处理查询时以某种方式修改"项目排名",以便可以添加一个条件,如下所示:

if (category == '$category')

从项目的ABS中减去1;

然后ORDER BY ABS

不确定对于知道正确代码的人来说,这是否是一个快速答案,或者这是一个更大的概念性"我如何实现这个结果"类型的问题。

无论哪种方式,都有一些上下文可能会有所帮助。 目标是对一堆提交进行排序,以便它们与值"评级"匹配,同时也为用户正在寻找的类别中的项目提供提升。

一个现实生活中的例子(不是我的网站):购物网站可以提供过滤器,根据价格搜索最接近的匹配项,但就好像某个类别中的所有商品(例如"红色")比实际更接近匹配 10 美元。

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

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

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

做类似的事情

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

如前所述,在 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服务器。一些可以与MySQL正常工作的东西可能不适用于MS-SQL Server,反之亦然。