2011-01-25 96 views
0

需要幫助瞭解這一點。搜索邏輯和算法

我有兩個表

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

其中一個用戶的名字和他的技術能力被存儲。

skills 
----- 
id 
language_name 

我們只存儲技能而不映射任何東西。

而且我有一個文本框搜索表單,您可以輸入主要技能:

eg. java javascript html css 

根據所輸入的值我想隨着技術的技能,找到了最佳人選,而且也顯示了人誰與搜索到的技能最接近。

任何想法如何去實現這一點。表格結構變化的建議也值得歡迎。

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

+0

最佳人員與技術技能和t他最接近技能搜索的人嗎?我沒有看到你的數據庫中有任何能力的判斷,所以如果兩個人都擁有Java,那麼他們在兩個類別中都會被並列第一。 – Michael 2011-01-25 06:05:26

回答

1

您既可以爲技能使用普通的標準化標記表並使用SQL,也可以將技能作爲單個列表存儲並在單列上使用FREETEXT搜索。

user  : id; name 
skill  : id; language_name 
user_skill : user_id; skill_id 

你遇到一個新的技能每一次,剛剛創建的技能爲它的新條目,所以「淨」,‘DOTNET的’,‘C#.net’將出現3次。

當搜索爲「爪哇JavaScript的HTML教程」,打破成清單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 
+0

嘿,謝謝你的查詢。只是想知道,是否可以修改它以顯示未匹配在不同列中的技能列表? – Zaje 2011-01-25 08:56:52