【问题标题】:Search logic and algorithm搜索逻辑和算法
【发布时间】:2011-01-25 05:57:59
【问题描述】:

需要帮助解决这个问题。

我有两张桌子

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

存储用户名和他的技术技能的位置。

skills
-----
id
language_name

我们只存储技能而不映射到任何东西。

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

eg. java javascript html css

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

知道如何实现这一目标。也欢迎对表结构的更改提出建议。

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

【问题讨论】:

  • 具有技术技能的最佳人和最接近所搜索技能的人之间有什么区别?我在你的数据库中没有看到任何能力判断,所以如果两个人都拥有 Java,他们将在这两个类别中并列第一。

标签: sql algorithm data-structures logic


【解决方案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

【讨论】:

  • 您好,感谢您的询问。就是想知道,能不能修改成在不同的栏目中显示未匹配的技能列表??
  • 是否有可能给 MySQL 替换相同的??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2012-01-10
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多