您可以对技能使用正常的规范化标记表并使用 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