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

如何合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:18:14