0

したがって、メンターとメンティーの 2 人のユーザーがいます。

メンティーに、スキルのマッチングに基づいたメンターのリストを表示したいと考えています。

したがって、登録は一連のチェックボックスになります...

メンティーは次のことを確認します。

助けが必要です

[] Branding
[] Marketing
[] Legal stuff

メンターは次のことを確認します。

私の専門知識

[] Branding
[] Marketing
[] Legal stuff

最も共通性に基づいてこれらの人を一致させるための SQL サーバー クエリはありますか?

これがすべて理にかなっていることを願っています:\

乾杯

4

2 に答える 2

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
于 2012-04-05T13:26:00.243 に答える
0

これが解決策です。@UserSkill テーブルの is_requesting ビットに注意してください。1 人のユーザーが、あるスキルではメンティーになり、別のスキルではメンターになることができます。最も合理的なアプローチのようです。

クエリを拡張して、テーブルに再び結合し、いくつかの楽しい文字列連結を使用することで、各関係のスキルも含めることができます。

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
于 2012-04-05T15:21:01.607 に答える