sql多对多查询统计,一个主题多个关键字,一个关键字多个文章,一个文章多个关键字

1.开发中遇到个奇葩的问题,貌似数学集合的问题,纠结了半天后来解决。
1.1业务场景A主题表,一个主题有多个关键字,假设A表有一个主题主题人类,关键字为猩猩,猴子。B表为命中表,如一条记录命中关键字猩猩,一条记录命中猴子。
2为了统计主题,所以将主题拆分为一个主题对顶多条数据,以关键字拆分。

sql多对多查询统计,一个主题多个关键字,一个关键字多个文章,一个文章多个关键字_第1张图片

统计主题信息量:

SELECT t.`id`,t.`name`, i.`id`,COUNT(1) FROM theme t LEFT JOIN info i ON INSTR(i.`key_word`, t.`key_word`) GROUP BY t.id

sql多对多查询统计,一个主题多个关键字,一个关键字多个文章,一个文章多个关键字_第2张图片

问题来了:总计有3条数据,但是统计处理5条,命中多个关键字的信息被重复统计了,应过滤使用distinct

SELECT a.*, COUNT(1) FROM (
	SELECT DISTINCT t.`id` AS tid,t.`name`, i.`id` FROM theme t LEFT JOIN info i ON INSTR(i.`key_word`, t.`key_word`) 
)a GROUP BY a.tid
sql多对多查询统计,一个主题多个关键字,一个关键字多个文章,一个文章多个关键字_第3张图片

问题又来了,主题有信息的统计的正确,但是大象在信息表里没有出现,这是因为left jon的特性决定的,再次改进使用sum方法

SELECT a.tid, a.name, SUM(a.cnt) FROM (
	SELECT DISTINCT t.`id` AS tid,t.`name`, i.`id`,
	(CASE WHEN i.`id` IS NULL THEN 0 ELSE 1 END) AS cnt
	FROM theme t LEFT JOIN info i ON INSTR(i.`key_word`, t.`key_word`) 
)a GROUP BY a.tid

最后结果

sql多对多查询统计,一个主题多个关键字,一个关键字多个文章,一个文章多个关键字_第4张图片



你可能感兴趣的:(sql)