2011-01-25 19 views
0

これを理解する助けが必要です。検索ロジックとアルゴリズム

私は2つのテーブル

user 
---- 
name 
skills (comma separated value of skills;not mapped to next table) 
ユーザー名と彼の技術的なスキルが保存されている

を持っています。

skills 
----- 
id 
language_name 

ここでは、何もマッピングされていないスキルしか保存しません。

そして、私はあなたが入力主要スキルできる1つのテキストフィールドと検索フォームがあります:私は技術的なスキルを持つ最高の人を見つけて、また誰が人を表示したい値に基づいて

eg. java javascript html css 

に入ったが検索されたスキルに最も近くなります。

これを達成するにはどうすればよいですか。テーブル構造の変更に関する推奨事項も歓迎されます。

注:best人物は、リストに最も多くのスキルを持つ人です。

+0

技術スキルとt彼はスキルに最も近いところに来る人を検索しましたか?私はあなたのデータベースで能力の判断を見ないので、もし2人ともにJavaを持っていれば、両方のカテゴリーで最初に結びついています。 – Michael

答えて

1

スキルに正規化されたタグテーブルを使用してSQLを使用することも、スキルを単一のリストとして格納して、単一の列でFREETEXT検索を使用することもできます。

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

あなたは新しいスキルに遭遇するたびに、単にスキルでそれのための新しいエントリを作成し、その「.NET」、 『過去ログ』、 『C#.NETが』 3回表示されるでしょう。

4のリストにそれを破る、「ジャワのjavascriptのHTML、CSS、」ベストマッチを探し、そのクエリはオンこの

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

+0

同じものに対してMySQLの置き換えを与えることは可能でしょうか? – Zaje