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
相关产品推荐
相关产品推荐

