所以我有兩個用戶一個導師和一個導師。用戶關聯匹配SQL查詢?
我想根據他們的技能嚮導師顯示導師名單。
所以登記將是一堆複選框該說的...
受指導者認爲:
我需要
[] Branding
[] Marketing
[] Legal stuff
導師幫忙看:
我的專長
[] Branding
[] Marketing
[] Legal stuff
是否有一個SQL服務器查詢來匹配這些傢伙了基於2008年的共性?
希望這一切是有道理的:\
乾杯
所以我有兩個用戶一個導師和一個導師。用戶關聯匹配SQL查詢?
我想根據他們的技能嚮導師顯示導師名單。
所以登記將是一堆複選框該說的...
受指導者認爲:
我需要
[] Branding
[] Marketing
[] Legal stuff
導師幫忙看:
我的專長
[] Branding
[] Marketing
[] Legal stuff
是否有一個SQL服務器查詢來匹配這些傢伙了基於2008年的共性?
希望這一切是有道理的:\
乾杯
如何開頭是這樣的:
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
這裏有一個解決方案。請注意@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
你只是想匹配的最高數量的常見選擇?是一位資歷過高的導師更可取,還是浪費?可能有重量分配,例如語言技能比處理核廢料的經驗值得更多? – HABO 2012-04-05 12:47:52
這套技能是事先確定的還是動態的? – Goran 2012-04-05 12:51:59
@Goran它將是動態的... – 2012-04-05 13:04:02