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
相关产品推荐
相关产品推荐

