SQL查询问题:统计跨双类型导演数并去除重复类型对
解决无序电影类型对重复统计的问题
你的查询结果出现(a,b)和(b,a)这类重复的无序类型对,核心原因是筛选类型对的条件逻辑不对:你用了g2.genre_id <> g1.genre_id,这个条件会包含所有“类型A≠类型B”的双向组合——比如当g1取genre_id=1、g2取genre_id=2时会生成一条记录,当g1取genre_id=2、g2取genre_id=1时又会生成另一条记录,这两条记录本质是同一个无序类型对,却被统计了两次。
要只保留唯一的无序类型对,你只需要把类型对的筛选条件从“不等于”改成严格的大小比较,比如g2.genre_id > g1.genre_id(或者g1.genre_id > g2.genre_id,选其中一种规则即可)。这样就能确保每一对类型只会以固定的顺序出现一次,不会产生重复。
另外,我把你原来的逗号连接改成了显式JOIN语法,这样表之间的关联关系更清晰,可读性和可维护性更好:
SELECT g1.genre_id AS genre1, g2.genre_id AS genre2, COUNT(DISTINCT mhd1.director_id) AS directors_count FROM genre g1 JOIN genre g2 ON g2.genre_id > g1.genre_id -- 关键修改:用严格大于代替不等于,避免双向重复 JOIN movie_has_genre mhg1 ON mhg1.genre_id = g1.genre_id JOIN movie_has_director mhd1 ON mhd1.movie_id = mhg1.movie_id JOIN movie_has_genre mhg2 ON mhg2.genre_id = g2.genre_id JOIN movie_has_director mhd2 ON mhd2.movie_id = mhg2.movie_id AND mhd2.director_id = mhd1.director_id GROUP BY g1.genre_id, g2.genre_id;
这样修改后,每一对无序类型只会被统计一次,比如(1,2)会被保留,但(2,1)会被过滤掉,完全符合你想要的“唯一无序类型对”的需求。
内容的提问来源于stack exchange,提问作者Riseos
相关产品推荐
相关产品推荐

