需要帮助解决这个问题。
我有两张桌子
user
----
name
skills (comma separated value of skills;not mapped to next table)
存储用户名和技术技能。
skills
-----
id
language_name
我们只存储没有映射到任何东西的技能。
我有一个带有一个文本字段的搜索表单,您可以在其中输入主要技能:
eg. java javascript html css
根据输入的值,我希望找到具有技术技能的最佳人选,并展示最接近所搜索技能的人。
我知道如何实现这一目标。关于表结构变化的建议也是受欢迎的。
注意: best
人是列表中技能最多的人。
答案 0 :(得分:1)
您可以使用普通的标准化标记表来使用技能并使用SQL,也可以将技能存储为单个列表并在单列上使用FREETEXT搜索。
user : id; name
skill : id; language_name
user_skill : user_id; skill_id
每次遇到新技能时,只需在技能上为其创建一个新条目,因此“。Net”,“DotNet”,“C#.Net”将出现3次。
在搜索“java javascript html css”的最佳匹配时,将其分解为4的列表,因此查询看起来像这样
select top 10 u.name, count(*) matched
from skill s
inner join user_skill us on s.skill_id = us.skill_id
inner join user u on u.user_id = us.user_id
where s.language_name in ('java','javascript','html','css')
group by u.name
order by matched desc
(显示前10名)
在SQL Server 2005上,在FOR XML的帮助下,您还可以获得每个最佳10个匹配用户的缺失技能列表
select top(10)
u.id,
u.name,
count(*) matched,
stuff(
(
select ',' + s.language_name
from skill s
where s.language_name in ('java','javascript','html','css')
and not exists (
select * from user_skill u2
where u2.user_id=u.id
and u2.skill_id=s.skill_id)
for xml path('')
),1,1,'') as missing_list
from skill s
inner join user_skill us on s.skill_id = us.skill_id
inner join [user] u on u.user_id = us.user_id
where s.language_name in ('java','javascript','html','css')
group by u.id, u.name
order by matched desc