You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL多类型关联记录统计:按文件统计男女演员数量

优化MySQL男女演员统计查询的高效方案

嘿,我发现你当前的查询不仅效率有提升空间,还存在计数不准确的问题——两次LEFT JOIN会导致笛卡尔积,让统计结果翻倍!咱们来一步步解决这个问题。

原写法的核心问题

你用两次LEFT JOIN关联actores表分别筛选男/女演员,这会让数据集意外膨胀:比如某个文件有2个男演员和3个女演员,JOIN后会生成2*3=6条记录,此时COUNT(ac.id)COUNT(acM.id)都会返回6,而不是正确的2和3。同时,两次JOIN也额外增加了数据库的查询开销。

更高效且正确的写法:单JOIN + 条件聚合

只需要关联一次actores表,用条件聚合函数分别统计男女数量,既避免了笛卡尔积问题,又减少了JOIN的开销:

写法1:用COUNT + CASE WHEN

SELECT 
    of.expediente,
    -- 仅统计性别为'H'的演员ID(不满足条件时返回NULL,COUNT会自动忽略)
    COUNT(CASE WHEN ac.genero = 'H' THEN ac.id END) AS Hombres,
    COUNT(CASE WHEN ac.genero = 'M' THEN ac.id END) AS Mujeres
FROM oficialias of
LEFT JOIN actores ac ON ac.expediente = of.expediente
-- 如需过滤特定文件,在此添加WHERE条件
-- WHERE of.expediente = '目标文件编号'
GROUP BY of.expediente;

写法2:用SUM + CASE WHEN

如果更习惯用SUM逻辑,满足条件加1、否则加0,结果完全一致:

SELECT 
    of.expediente,
    SUM(CASE WHEN ac.genero = 'H' THEN 1 ELSE 0 END) AS Hombres,
    SUM(CASE WHEN ac.genero = 'M' THEN 1 ELSE 0 END) AS Mujeres
FROM oficialias of
LEFT JOIN actores ac ON ac.expediente = of.expediente
GROUP BY of.expediente;

额外性能优化建议

为了让这个查询跑得更快,建议给actores表创建复合索引:

CREATE INDEX idx_actores_expediente_genero ON actores(expediente, genero);

这个索引能让数据库快速定位到对应文件的男女演员,避免全表扫描。另外,如果oficialiasexpediente是主键,GROUP BY操作也会更高效。

内容的提问来源于stack exchange,提问作者Vanss Ket Ball

火山引擎 最新活动