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

MySQL联表查询中GROUP BY与HAVING的问题及技能去重查询需求

解决MySQL中取两表不重复技能名称的问题

嘿,我来帮你搞定这个查询需求!首先咱们明确一下:你要的是所有至少被一名申请人掌握,或者至少被一个职位要求的不重复技能名称对吧?其实这个需求根本不用复杂的GROUP BY或者HAVING,用UNION就能轻松解决,而且效率还更高。

最简洁的解决方案

直接用UNION合并两个表的技能名称,它会自动帮你去除重复值:

SELECT sname FROM SPOSSESSED
UNION
SELECT sname FROM SNEEDED;

这个语句的逻辑很简单:先从申请人技能表(SPOSSESSED)里取出所有技能名称,再从职位需求技能表(SNEEDED)里取出所有技能名称,UNION会自动合并这两个结果集,并且去掉重复的技能名,完美符合你的要求。

如果你非要用GROUP BY的话(虽然没必要)

要是你之前执着于用GROUP BY,也可以这么写,但其实多做了一步:

SELECT sname
FROM (
    -- 先合并所有技能(包括重复的)
    SELECT sname FROM SPOSSESSED
    UNION ALL
    SELECT sname FROM SNEEDED
) AS combined_skills
-- 按技能名分组去重
GROUP BY sname;

这里先用UNION ALL把两个表的所有技能(不管重复多少次)合并到一个临时表,再通过GROUP BY sname来实现去重。但显然第一种方法更直接高效。

为什么你之前用GROUP BY/HAVING会出问题?

大概率是你错误地尝试关联两个表(比如用JOIN),导致出现了笛卡尔积(两个表的记录无意义地交叉匹配),之后用GROUP BY处理的时候逻辑混乱。其实这个需求不需要关联表,因为我们要的是两个集合的并集,而不是关联查询或者交集。

举个反例,如果你错误地写了SELECT sname FROM SPOSSESSED JOIN SNEEDED GROUP BY sname,这会把申请人的技能和职位需求的技能强行配对,得到的结果可能不全,还会产生不必要的计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:37:50