+ -
当前位置:首页 → 问答吧 → 数据查询匹配问题

数据查询匹配问题

时间:2011-12-13

来源:互联网

假设数据库有5列数据,我一次性输入5个参数,想从这个数据库中把与它匹配度最高的一条记录找出来,用什么算法好啊?
匹配度最高可以假定为相等或者是相近。
为简单起见,暂时选择相等。
有5个接近就输出5个的,没有就找4个最接近的,以此类推。
以前看过类似的一篇神作,今天实在找不到了,大神们有什么好的解决思路,洗耳恭听中。

作者: mdxslm   发布时间: 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) + 
  (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

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=@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

引用 2 楼 guguda2008 的回复:
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

大乌龟小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 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

引用 5 楼 guguda2008 的回复:
大乌龟小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

引用 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) ……

大神啊,这样执行起来效率会怎样?

作者: mdxslm   发布时间: 2011-12-13

引用 7 楼 mdxslm 的回复:

引用 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

引用 7 楼 mdxslm 的回复:

引用 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