目前我有一个SQL查询,它查找可接受的匹配项,然后使用以下方法对它们进行排序:
ORDER BY ABS (itemranking - $rating)
是否可以在处理查询时以某种方式修改“项目排名”,以便可以添加类似以下内容的条件:
if (category == '$category')
从项目的ABS中减去1;
然后ORDER BY ABS
?
我不确定这对于那些知道正确代码的人来说是否是一个快速的答案,或者它是否是一个更大的概念“我怎么能实现这个结果”类型的问题。
无论哪种方式,有一些上下文可能会有所帮助。目标是对一堆提交进行排序,使它们匹配值“rating”,同时也提升用户正在寻找的类别中的项目。
一个真实的例子(不是我的网站):购物网站可以提供一个过滤器,在价格方面搜索最接近的匹配,但就好像某个类别中的所有项目(例如“红色”)都要接近10美元比实际更匹配。
答案 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,反之亦然。