如何合并MySQL查询获取指定文档未使用的高频词列表?
解决方案:获取指定文档未使用的Top5高频词
我来帮你把两个查询的功能整合起来,完美实现你想要的结果。这里的核心思路是用LEFT JOIN把词表、全局词频统计和目标文档的使用记录关联起来,一步步过滤和排序:
最终SQL查询
SELECT w.idwords AS wID, w.wordscol AS wrd, COALESCE(f.freq, 0) AS freq FROM words w LEFT JOIN ( -- 统计每个词在所有文档中的总使用频率 SELECT words_idwords, COUNT(*) AS freq FROM docs_has_words GROUP BY words_idwords ) f ON w.idwords = f.words_idwords WHERE -- 排除文档1已使用的词 w.idwords NOT IN ( SELECT words_idwords FROM docs_has_words WHERE docs_iddocs = 1 ) ORDER BY freq DESC, w.idwords ASC LIMIT 5;
代码解释
- 全局词频统计子查询
f:这部分对应你第一个查询的功能,计算每个词在所有文档中的总出现次数。 - LEFT JOIN词表与统计结果:确保主词表中的所有词都会被保留,那些从未被使用过的词,
freq会返回NULL,我们用COALESCE(f.freq, 0)把NULL转换为0,满足你“包含零词频”的要求。 - 过滤已使用的词:通过
NOT IN子句排除掉文档iddocs=1已经使用过的词,对应你第二个查询的逻辑。 - 排序与取Top5:按频率降序排序,频率相同则按词ID升序,最后用
LIMIT 5取出前5个结果。
性能优化方案(针对大数据量)
如果你的数据量较大,NOT IN子查询可能会有性能瓶颈,可以改用LEFT JOIN + IS NULL的写法,利用索引提升效率:
SELECT w.idwords AS wID, w.wordscol AS wrd, COALESCE(f.freq, 0) AS freq FROM words w LEFT JOIN ( SELECT words_idwords, COUNT(*) AS freq FROM docs_has_words GROUP BY words_idwords ) f ON w.idwords = f.words_idwords -- 关联文档1的使用记录 LEFT JOIN docs_has_words dw ON w.idwords = dw.words_idwords AND dw.docs_iddocs = 1 WHERE dw.words_idwords IS NULL -- 筛选出文档1未使用的词 ORDER BY freq DESC, w.idwords ASC LIMIT 5;
这个写法通过左连接文档1的使用记录,然后筛选出未匹配到的记录(即未使用的词),比NOT IN更适合处理大数据场景。
内容的提问来源于stack exchange,提问作者SlowLearner
相关产品推荐
相关产品推荐

