数据查询匹配问题
时间:2011-12-13
来源:互联网
匹配度最高可以假定为相等或者是相近。
为简单起见,暂时选择相等。
有5个接近就输出5个的,没有就找4个最接近的,以此类推。
以前看过类似的一篇神作,今天实在找不到了,大神们有什么好的解决思路,洗耳恭听中。
作者: mdxslm 发布时间: 2011-12-13
select t.*,
(case when c1 = @c1 then 1 else 0 end) +
(case when c1 = @c2 then 1 else 0 end) +
...
(case when c1 = @c5 then 1 else 0 end) +
(case when c2 = @c1 then 1 else 0 end) +
(case when c2 = @c2 then 1 else 0 end) +
...
(case when c2 = @c5 then 1 else 0 end) +
... cnt
from tb t
order by cnt desc
作者: dawugui 发布时间: 2011-12-13
DECLARE @A INT,@B INT,@C INT,@D INT,@E INT SELECT TOP 1 WITH TIES A,B,C,D,E FROM TB WHERE A=@A OR B=@B OR C=@C OR D=@D OR E=@E ORDER BY CASE WHEN A=@A THEN 1 ELSE 0 END +CASE WHEN B=@B THEN 1 ELSE 0 END +CASE WHEN C=@C THEN 1 ELSE 0 END +CASE WHEN D=@D THEN 1 ELSE 0 END +CASE WHEN E=@E THEN 1 ELSE 0 END DESC
作者: guguda2008 发布时间: 2011-12-13
作者: guguda2008 发布时间: 2011-12-13
SQL code
DECLARE @A INT,@B INT,@C INT,@D INT,@E INT
SELECT TOP 1 WITH TIES A,B,C,D,E
FROM TB
WHERE A=@A OR B=@B OR C=@C OR D=@D OR E=@E
ORDER BY
CASE WHEN A=@A THEN 1 ELSE 0 END
+CASE WHEN B……
.
作者: fredrickhu 发布时间: 2011-12-13
SQL code
DECLARE @A INT,@B INT,@C INT,@D INT,@E INT SELECT TOP 1 WITH TIES A,B,C,D,E FROM TB WHERE A IN(@A,@B,@C,@D,@E) OR B IN(@A,@B,@C,@D,@E) OR C IN(@A,@B,@C,@D,@E) OR D IN(@A,@B,@C,@D,@E) OR E IN(@A,@B,@C,@D,@E) ORDER BY CASE WHEN A IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 END +CASE WHEN B IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 END +CASE WHEN C IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 END +CASE WHEN D IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 END +CASE WHEN E IN(@A,@B,@C,@D,@E) THEN 1 ELSE 0 END DESC
作者: guguda2008 发布时间: 2011-12-13
大乌龟小F看看这样行不
SQL code
DECLARE @A INT,@B INT,@C INT,@D INT,@E INT
SELECT TOP 1 WITH TIES A,B,C,D,E
FROM TB
WHERE A IN(@A,@B,@C,@D,@E)
OR B IN(@A,@B,@C,@D,@E)
OR C IN(@A,@B,@C,@D,@E)
OR D ……
这样是可以的 不过效率不会高
作者: fredrickhu 发布时间: 2011-12-13
假设参数为@c1..@c5,字段为c1..c5
select t.*,
(case when c1 = @c1 then 1 else 0 end) +
(case when c1 = @c2 then 1 else 0 end) +
...
(case when c1 = @c5 then 1 else 0 end) ……
大神啊,这样执行起来效率会怎样?
作者: mdxslm 发布时间: 2011-12-13
引用 1 楼 dawugui 的回复:
假设参数为@c1..@c5,字段为c1..c5
select t.*,
(case when c1 = @c1 then 1 else 0 end) +
(case when c1 = @c2 then 1 else 0 end) +
...
(case when c1 = @c5 then 1 else 0 end) ……
大神……
从数据库找一个"匹配度"的查询,很难会有多高效率的.
作者: qianjin036a 发布时间: 2011-12-13
引用 1 楼 dawugui 的回复:
假设参数为@c1..@c5,字段为c1..c5
select t.*,
(case when c1 = @c1 then 1 else 0 end) +
(case when c1 = @c2 then 1 else 0 end) +
...
(case when c1 = @c5 then 1 else 0 end) ……
大神……
你这个需求不做缓存本身就是个很慢的查询,无论如何都要走全表的。
作者: guguda2008 发布时间: 2011-12-13
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28