搜索逻辑和算法

时间:2011-01-25 05:58:00

标签: sql algorithm data-structures logic

需要帮助解决这个问题。

我有两张桌子

user
----
name
skills (comma separated value of skills;not mapped to next table)

存储用户名和技术技能。

skills
-----
id
language_name

我们只存储没有映射到任何东西的技能。

我有一个带有一个文本字段的搜索表单,您可以在其中输入主要技能:

eg. java javascript html css

根据输入的值,我希望找到具有技术技能的最佳人选,并展示最接近所搜索技能的人。

我知道如何实现这一目标。关于表结构变化的建议也是受欢迎的。

注意: best人是列表中技能最多的人。

1 个答案:

答案 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