我有两张桌子:
和它们之间的连接表称为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
答案 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);
我的结果: 显然,你可以用关系方法回答相同的查询,这只是一种不同的做事方式。完整脚本here。