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

MySQL中如何避免嵌套查询中相同school_id的school_rating重复计算

解决方案

方案1:预计算学校评分后关联(最推荐)

先单独对所有school_id做一次rating计算,再和人员学校关联表做关联,保证每个学校的评分仅计算一次,示例代码如下:

-- 先计算所有学校的评分,每个school_id仅生成一条结果
WITH school_rating_mapping AS (
    SELECT
        school_id,
        -- 此处替换为你实际的school_rating计算逻辑
        (SUM(xxx) / COUNT(yyy)) AS school_rating
    FROM 你的学校评分相关数据表
    -- 此处加你原来的过滤、关联逻辑
    GROUP BY school_id
)
SELECT
    ps.person_id,
    ps.school_id,
    srm.school_rating
FROM 人员学校关联表 ps
INNER JOIN school_rating_mapping srm 
    ON ps.school_id = srm.school_id;

这种方式逻辑清晰,MySQL优化器可以稳定识别为仅做一次全量评分计算,不会出现重复计算问题。

方案2:使用持久化中间表(适合非实时场景)

如果school_rating的计算频率很低、对数据实时性要求不高,可以直接创建一张中间表存储计算好的学校评分:

-- 创建中间表
CREATE TABLE school_rating_cache (
    school_id INT PRIMARY KEY,
    school_rating DECIMAL(10,2) NOT NULL
);

-- 定时调度如下语句更新中间表数据
TRUNCATE TABLE school_rating_cache;
INSERT INTO school_rating_cache
SELECT
    school_id,
    -- 你的计算逻辑
    (SUM(xxx) / COUNT(yyy)) AS school_rating
FROM 你的学校评分相关数据表
GROUP BY school_id;

查询时直接关联中间表即可,性能最优,适合高频查询场景。

方案3:确定性函数复用结果

如果你的计算逻辑可以封装为函数,可以声明为DETERMINISTIC,相同school_id输入时MySQL会复用计算结果:

CREATE FUNCTION get_school_rating(p_school_id INT) 
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    DECLARE rating DECIMAL(10,2);
    -- 你的计算逻辑赋值给rating
    RETURN rating;
END;

查询时直接调用函数即可:

SELECT
    person_id,
    school_id,
    get_school_rating(school_id) AS school_rating
FROM 人员学校关联表;

注意此方案仅适合计算逻辑简单、输入参数少的场景,性能不如预计算方案。

内容的提问来源于stack exchange,提问作者Snookums

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:06:00