SQL查询,以查找具有其他技能的人员?

时间:2018-03-22 16:39:40

标签: sql sql-server tsql

enter image description here

我有两张桌子:

  1. UserInfo
  2. 技能
  3. 和它们之间的连接表称为UserSkill,如您所见 图的右侧部分。

    我想知道谁知道或熟练掌握Java,他还擅长什么。我的意思是例如我知道java,Go,PHP,python和用户号2知道java和python和CSS。所以这个问题的答案是:无论谁知道java,他知道的还有GO,PHP,Python和CSS。

    它就像推荐系统一样,除了这个产品,他们还买了什么呢?就像我们在亚马逊所拥有的那样......

    对此最好的查询是什么?

    谢谢

    更多信息:

    UserInfo

    U-id   U-name
    1       A
    2       B
    3       C
    

    SkillInfo

    S-id    S-Name
    1       Java
    2       GO
    3       PHP
    4       Python
    5       CSS
    

    UserSkill

    U-id    S-id
    1        1
    1        2
    1        3
    1        4
    2        1
    2        4
    2        5
    

3 个答案:

答案 0 :(得分:0)

为了使这更具活力,请更换硬编码的' java'使用可以传递给任何技能类型过滤的变量,可能会创建一个存储过程,以便您可以传递变量, 编辑了列名,因为我没有查看您提供的图像:

--Outer query selects all skills of users which are not java and user has skill of java, 
--the inner query selects all user ids where the user has a skill of java    

SELECT sk.[SkillName], ui.[UserName], ui.[UserId]
FROM [dbo].[Skill] AS sk
INNER JOIN [dbo].[UserSkill] AS us
ON us.[SkillId] = sk.[SkillId]
INNER JOIN [dbo].[UserInfo] AS ui
ON ui.[UserId] = us.[UserId]
WHERE sk.[Skill] <> 'java' AND ui.[UserId] IN (
                                                SELECT [UserId]
                                                FROM [dbo].[UserInfo] ui
                                                INNER JOIN [dbo].[UserSkill] us
                                                ON us.[UserId] = ui.[UserId]
                                                INNER JOIN [dbo].[Skill] sk
                                                ON sk.[SkillId] = us.[SkillId]
                                                WHERE sk.[SkillName] = 'java')

答案 1 :(得分:0)

这就是我找到的

--Formatted query
select 
    o.UserName, k.SkillName
from 
    UserSkill S 
inner join 
    UserSkill SS on s.UserID = ss.UserID 
                 and s.SkillID = 1 
                 and ss.SkillID <> 1 
inner join 
    Skill k on k.SkillID = ss.SkillID
inner join 
    UsersINFO O on o.UserID = ss.UserID

答案 2 :(得分:0)

在SQL Server 2017和Azure SQL DB中,您可以使用new graph database capabilities和新的MATCH子句来回答这样的查询,例如

SELECT FORMATMESSAGE ( 'User %s has skill %s and other skill %s.', [user1].[U-name], mainSkill.[S-name], otherSkill.[S-name] ) result
FROM 
    dbo.users user1, 
    dbo.hasSkill hasSkill1, dbo.skills mainSkill, dbo.hasSkill hasSkill2, dbo.skills otherSkill
WHERE mainSkill.[S-name] = 'CSS'
  AND otherSkill.[S-name] != mainSkill.[S-name]
  AND MATCH ( mainSkill<-(hasSkill1)-user1-(hasSkill2)->otherSkill);

我的结果: results 显然,你可以用关系方法回答相同的查询,这只是一种不同的做事方式。完整脚本here