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);
这个索引能让数据库快速定位到对应文件的男女演员,避免全表扫描。另外,如果oficialias的expediente是主键,GROUP BY操作也会更高效。
内容的提问来源于stack exchange,提问作者Vanss Ket Ball




