1

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

ORDER BY ABS (itemranking - $rating)

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

if (category == '$category')

项目的 ABS 减 1;

那么ORDER BY ABS

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

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

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

4

3 回答 3

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
于 2012-08-12T02:07:05.700 回答
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,反之亦然。

于 2012-08-12T05:02:12.020 回答
0

做类似的事情

Select if(category='$category', ABS (itemranking - $rating) - 1, ABS (itemranking - rating)) as calc 
FROM table 
ORDER BY calc
于 2012-08-12T02:26:10.833 回答