基于多表关联的SQL查询:查找拥有相同技能的用户
解决多对多关系中查找拥有相同技能的用户对问题
嘿,我来帮你补全并优化这个SQL查询!你已经找对了方向——通过自连接桥接表UserSkill来关联拥有同一技能的用户,接下来只需要完善关联逻辑并避免重复结果即可。
完整SQL查询语句
SELECT ui1.`U-name` AS UserName1, ui2.`U-name` AS UserName2, s.`S-name` AS SkillName FROM UserSkill us1 INNER JOIN UserSkill us2 ON us1.`S-id` = us2.`S-id` AND us1.`U-id` < us2.`U-id` -- 核心:避免重复用户对(如A-B和B-A)及自匹配 INNER JOIN UserInfo ui1 ON us1.`U-id` = ui1.`U-id` INNER JOIN UserInfo ui2 ON us2.`U-id` = ui2.`U-id` INNER JOIN Skill s ON us1.`S-id` = s.`S-id` ORDER BY SkillName, UserName1, UserName2;
关键逻辑解释
- 自连接
UserSkill表:通过S-id关联,能直接找到所有共享同一技能的用户组合。添加us1.U-id < us2.U-id是非常重要的一步——它会过滤掉重复的用户对(比如不会同时出现A-B和B-A),同时也避免了用户自己和自己匹配的无效结果。 - 关联用户信息表:分别连接两次
UserInfo,将两个用户的ID转换成对应的用户名。 - 关联技能表:通过
S-id关联Skill表,把技能ID转换成易读的技能名称。 - 排序优化:最后按技能名、用户名排序,让结果更规整,便于查看。
示例结果验证
用你给出的UserSkill示例数据:
| U-id | S-id |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 7 |
| 2 | 1 |
| 2 | 6 |
假设Skill表中S-id=1对应Java,UserInfo表中U-id=1是A、U-id=2是B,查询结果会是:
| UserName1 | UserName2 | SkillName |
|---|---|---|
| A | B | Java |
完全符合你预期的输出格式!
额外说明
如果需要汇总用户对的所有共同技能(比如一行显示A和B的所有共同技能),可以在查询中添加GROUP BY和GROUP_CONCAT(以MySQL为例),但根据你的预期结果,当前的查询已经完美匹配需求。
内容的提问来源于stack exchange,提问作者Pantea
相关产品推荐
相关产品推荐

