You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多表关联的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-idS-id
11
12
17
21
26

假设Skill表中S-id=1对应Java,UserInfo表中U-id=1是A、U-id=2是B,查询结果会是:

UserName1UserName2SkillName
ABJava

完全符合你预期的输出格式!

额外说明

如果需要汇总用户对的所有共同技能(比如一行显示A和B的所有共同技能),可以在查询中添加GROUP BY和GROUP_CONCAT(以MySQL为例),但根据你的预期结果,当前的查询已经完美匹配需求。

内容的提问来源于stack exchange,提问作者Pantea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:19:51