请教多条件查询后按照匹配度排序

时间:2022-11-09 05:37:58
用户在前台提交个表单
<form>
专业:<select name="zy"><option value="美术">美术</option><option value="音乐">音乐</option><option value="计算机">计算机</option><option value="体育">体育</option></select><br />
学历:<select name="xl"><option value="">请选择</option><option value="大专以下">大专以下</option><option value="大专">大专</option><option value="本科">本科</option><option value="本科以上">本科以上</option></select><br />
年龄:<select name="nl"><option value="">请选择</option><option value="20-30">20-30岁</option><option value="30-35">30-35岁</option><option value="35-40">35-40岁</option></select><br />

籍贯:<select name="jg"><option value="">请选择</option><option value="上海">上海</option><option value="北京">北京</option><option value="广东">广东</option></select><br />
<input type="submit" value="提交" />
</form>


这个是数据库
请教多条件查询后按照匹配度排序

用户提交后(有可能提交一个条件,有可能提交多个条件),然后按照匹配度最高的开始排序,显示数据库里的数据,并显示匹配度百分比,最高是100%,最低是0

谢谢

9 个解决方案

#1


adodb.recordset全部读取出来后GetRows转为数组自己就算匹配率,然后排序下输出

#2


引用 1 楼 showbo 的回复:
adodb.recordset全部读取出来后GetRows转为数组自己就算匹配率,然后排序下输出

没太明白,能否详细说下?谢谢

#3


考虑到分页的问题,感觉还是用 sql 做比较好。
1. 将所有过滤条件拆成单个,每一个条件都进行 select ,然后将结果集 union all
2. 对 1 中得到结果集根据 键值字段分组,并 count 键值字段,出现次数多的记录,匹配度自然高。

#4


引用 3 楼 cocoaevil 的回复:
考虑到分页的问题,感觉还是用 sql 做比较好。
1. 将所有过滤条件拆成单个,每一个条件都进行 select ,然后将结果集 union all
2. 对 1 中得到结果集根据 键值字段分组,并 count 键值字段,出现次数多的记录,匹配度自然高。


能否把代码发一下??谢谢了

#5


还是不太明白该如何做。。。

#6


你说的匹配度是什么意思?

#7


引用 6 楼 greatbody 的回复:
你说的匹配度是什么意思?


我也想问这个。

#8


引用 4 楼 zzhxlyh 的回复:
Quote: 引用 3 楼 cocoaevil 的回复:

考虑到分页的问题,感觉还是用 sql 做比较好。
1. 将所有过滤条件拆成单个,每一个条件都进行 select ,然后将结果集 union all
2. 对 1 中得到结果集根据 键值字段分组,并 count 键值字段,出现次数多的记录,匹配度自然高。


能否把代码发一下??谢谢了


假如用户提交的条件是这样的 :专业=美术;年龄=20-30;学历=大专;籍贯=北京。
则 SQL 代码会类似下面这样:
declare @zy as nvarchar(50)= N'美术'
declare @xl as nvarchar(50)=N'大专'
declare @nl as nvarchar(50)=N'20-30'
declare @jg as nvarchar(50)=N'北京';

with CTE1
as
(
select * from T2 where zy=@zy
union all
select * from T2 where xl=@xl
union all
select * from T2 where nl=@nl
union all
select * from T2 where jg=@jg
)

select ISNULL(num,0) as num,B.id,na,xb,zy,nl,jg,xl from (
(select COUNT(id) as num,id from CTE1
group by id) as A
right join T2 as B on A.id = B.id 
)
order by num desc


num 值越大则匹配度越高

#9


引用 8 楼 cocoaevil 的回复:
Quote: 引用 4 楼 zzhxlyh 的回复:

Quote: 引用 3 楼 cocoaevil 的回复:

考虑到分页的问题,感觉还是用 sql 做比较好。
1. 将所有过滤条件拆成单个,每一个条件都进行 select ,然后将结果集 union all
2. 对 1 中得到结果集根据 键值字段分组,并 count 键值字段,出现次数多的记录,匹配度自然高。


能否把代码发一下??谢谢了


假如用户提交的条件是这样的 :专业=美术;年龄=20-30;学历=大专;籍贯=北京。
则 SQL 代码会类似下面这样:
declare @zy as nvarchar(50)= N'美术'
declare @xl as nvarchar(50)=N'大专'
declare @nl as nvarchar(50)=N'20-30'
declare @jg as nvarchar(50)=N'北京';

with CTE1
as
(
select * from T2 where zy=@zy
union all
select * from T2 where xl=@xl
union all
select * from T2 where nl=@nl
union all
select * from T2 where jg=@jg
)

select ISNULL(num,0) as num,B.id,na,xb,zy,nl,jg,xl from (
(select COUNT(id) as num,id from CTE1
group by id) as A
right join T2 as B on A.id = B.id 
)
order by num desc


num 值越大则匹配度越高


十分感谢,我试下

#1


adodb.recordset全部读取出来后GetRows转为数组自己就算匹配率,然后排序下输出

#2


引用 1 楼 showbo 的回复:
adodb.recordset全部读取出来后GetRows转为数组自己就算匹配率,然后排序下输出

没太明白,能否详细说下?谢谢

#3


考虑到分页的问题,感觉还是用 sql 做比较好。
1. 将所有过滤条件拆成单个,每一个条件都进行 select ,然后将结果集 union all
2. 对 1 中得到结果集根据 键值字段分组,并 count 键值字段,出现次数多的记录,匹配度自然高。

#4


引用 3 楼 cocoaevil 的回复:
考虑到分页的问题,感觉还是用 sql 做比较好。
1. 将所有过滤条件拆成单个,每一个条件都进行 select ,然后将结果集 union all
2. 对 1 中得到结果集根据 键值字段分组,并 count 键值字段,出现次数多的记录,匹配度自然高。


能否把代码发一下??谢谢了

#5


还是不太明白该如何做。。。

#6


你说的匹配度是什么意思?

#7


引用 6 楼 greatbody 的回复:
你说的匹配度是什么意思?


我也想问这个。

#8


引用 4 楼 zzhxlyh 的回复:
Quote: 引用 3 楼 cocoaevil 的回复:

考虑到分页的问题,感觉还是用 sql 做比较好。
1. 将所有过滤条件拆成单个,每一个条件都进行 select ,然后将结果集 union all
2. 对 1 中得到结果集根据 键值字段分组,并 count 键值字段,出现次数多的记录,匹配度自然高。


能否把代码发一下??谢谢了


假如用户提交的条件是这样的 :专业=美术;年龄=20-30;学历=大专;籍贯=北京。
则 SQL 代码会类似下面这样:
declare @zy as nvarchar(50)= N'美术'
declare @xl as nvarchar(50)=N'大专'
declare @nl as nvarchar(50)=N'20-30'
declare @jg as nvarchar(50)=N'北京';

with CTE1
as
(
select * from T2 where zy=@zy
union all
select * from T2 where xl=@xl
union all
select * from T2 where nl=@nl
union all
select * from T2 where jg=@jg
)

select ISNULL(num,0) as num,B.id,na,xb,zy,nl,jg,xl from (
(select COUNT(id) as num,id from CTE1
group by id) as A
right join T2 as B on A.id = B.id 
)
order by num desc


num 值越大则匹配度越高

#9


引用 8 楼 cocoaevil 的回复:
Quote: 引用 4 楼 zzhxlyh 的回复:

Quote: 引用 3 楼 cocoaevil 的回复:

考虑到分页的问题,感觉还是用 sql 做比较好。
1. 将所有过滤条件拆成单个,每一个条件都进行 select ,然后将结果集 union all
2. 对 1 中得到结果集根据 键值字段分组,并 count 键值字段,出现次数多的记录,匹配度自然高。


能否把代码发一下??谢谢了


假如用户提交的条件是这样的 :专业=美术;年龄=20-30;学历=大专;籍贯=北京。
则 SQL 代码会类似下面这样:
declare @zy as nvarchar(50)= N'美术'
declare @xl as nvarchar(50)=N'大专'
declare @nl as nvarchar(50)=N'20-30'
declare @jg as nvarchar(50)=N'北京';

with CTE1
as
(
select * from T2 where zy=@zy
union all
select * from T2 where xl=@xl
union all
select * from T2 where nl=@nl
union all
select * from T2 where jg=@jg
)

select ISNULL(num,0) as num,B.id,na,xb,zy,nl,jg,xl from (
(select COUNT(id) as num,id from CTE1
group by id) as A
right join T2 as B on A.id = B.id 
)
order by num desc


num 值越大则匹配度越高


十分感谢,我试下