2012-04-05 82 views
0

所以我有兩個用戶一個導師和一個導師。用戶關聯匹配SQL查詢?

我想根據他們的技能嚮導師顯示導師名單。

所以登記將是一堆複選框該說的...

受指導者認爲:

我需要

[] Branding 
[] Marketing 
[] Legal stuff 

導師幫忙看:

我的專長

[] Branding 
[] Marketing 
[] Legal stuff 

是否有一個SQL服務器查詢來匹配這些傢伙了基於2008年的共性?

希望這一切是有道理的:\

乾杯

+0

你只是想匹配的最高數量的常見選擇?是一位資歷過高的導師更可取,還是浪費?可能有重量分配,例如語言技能比處理核廢料的經驗值得更多? – HABO 2012-04-05 12:47:52

+0

這套技能是事先確定的還是動態的? – Goran 2012-04-05 12:51:59

+0

@Goran它將是動態的... – 2012-04-05 13:04:02

回答

2

如何開頭是這樣的:

declare @Users as Table (UserId Int Identity, UserName VarChar(10), Mentor Bit) 
declare @Skills as Table (SkillId Int Identity, Skill VarChar(10)) 
declare @UserSkills as Table (UserId Int, SkillId Int) 

insert into @Users (UserName, Mentor) values ('Einstein', 1), ('Dilbert', 0), ('Marie', 1), ('The Fonz', 1) 
insert into @Skills (Skill) values ('Arithmetic'), ('Chemistry'), ('Dancing') 
insert into @UserSkills (UserId, SkillId) values 
    (1, 1), (1, 3), 
    (2, 1), (2, 3), 
    (3, 1), (3, 2), (3, 3), 
    (4, 3) 

-- All users. 
select U.*, S.* 
    from @Users as U inner join 
    @UserSkills as US on US.UserId = U.UserId inner join 
    @Skills as S on S.SkillId = US.SkillId 
    order by U.Mentor, U.UserName, S.Skill 

-- Matches for user 2. 
-- Should validate that they are not a mentor. 
declare @StudentId as Int = 2 
select UM.*, S.*, 
    (select count(42) from @UserSkills as USM inner join 
    @UserSkills as USS on USS.SkillId = USM.SkillId and USS.UserId = @StudentId and USM.UserId = UM.UserId) as 'MatchCount' 
    from @Users as UM inner join 
    @UserSkills as USM on USM.UserId = UM.UserId and UM.Mentor = 1 inner join 
    @Skills as S on S.SkillId = USM.SkillId inner join 
    @UserSkills as USS on USS.SkillId = USM.SkillId and USS.UserId = @StudentId 
    order by (select count(42) from @UserSkills as USM inner join 
    @UserSkills as USS on USS.SkillId = USM.SkillId and USS.UserId = @StudentId and USM.UserId = UM.UserId) desc, 
    UM.UserName, S.Skill 
0

這裏有一個解決方案。請注意@UserSkill表中的is_requesting位。一個用戶可以是一個技能的受指導者,另一個可以是導師。似乎是最合理的方法。

您可以通過再次連接到表格並使用某些有趣的字符串連接來擴展查詢以包含每個關係的技能。

DECLARE @User TABLE 
(
    id INT IDENTITY (1,1), 
    name VARCHAR(100) 
) 

DECLARE @Skill TABLE 
(
    id INT IDENTITY(1,1), 
    name VARCHAR(100) 
) 

DECLARE @UserSkill TABLE 
(
    [user_id] INT, 
    skill_id INT, 
    is_requesting BIT -- true if mentee asking for help, false if mentor offering help 
) 

INSERT INTO @User 
SELECT 'Alice' 
UNION SELECT 'Bob' 
UNION SELECT 'Charlie' 
UNION SELECT 'Doug' 

SELECT * FROM @User 

INSERT INTO @Skill 
SELECT 'Branding' 
UNION SELECT 'Marketing' 
UNION SELECT 'Legal' 

SELECT * FROM @Skill 

INSERT INTO @UserSkill 
SELECT 1, 1, 1 
UNION SELECT 1, 2, 1 
UNION SELECT 2, 2, 1 
UNION SELECT 2, 3, 0 
UNION SELECT 3, 1, 0 
UNION SELECT 3, 2, 0 
UNION SELECT 4, 2, 0 
UNION SELECT 4, 3, 0 

SELECT * 
FROM @User u 
JOIN @UserSkill us 
    ON u.id = us.[user_id] 
JOIN @Skill s 
    ON us.skill_id = s.id 

DECLARE @skill_string VARCHAR(1000) 

SELECT eu.name AS [Mentee] 
    , ru.name AS [Mentor] 
    , COUNT(*) AS [Commonality] 
FROM @User eu -- 'eu' for mente'e' 'u'ser 
JOIN @UserSkill eus 
    ON eu.id = eus.[user_id] 
    AND eus.is_requesting = 1 
JOIN @Skill es 
    ON eus.skill_id = es.id 
JOIN @UserSkill rus 
    ON eus.skill_id = rus.skill_id 
    AND rus.is_requesting = 0 
JOIN @User ru -- 'r' for mento'r' 'u'ser 
    ON rus.[user_id] = ru.id 
GROUP BY eu.name, ru.name 
ORDER BY eu.name, ru.name