您的平均值也可能略有偏差——或者至少需要额外的不必要的计算。
原因是行数沿两个维度成倍增加。更准确的解决方案是聚合 before 做join:
SELECT f.name, s.num_letters, AVG(t.numbers)
FROM first f INNER JOIN
(SELECT s.first_id, COUNT(*) as num_letters
FROM second s
WHERE s.letters IN ('aa', 'bb', 'cc', 'dd')
GROUP BY s.first_id
) s
ON s.first_id = f.id LEFT JOIN
third t
ON t.first_id = f.id
GROUP BY f.id, s.num_letters;
对于此类查询,最好将所有聚合移动到子查询中:
SELECT f.name, s.num_letters, t.avg_numbers
FROM first f INNER JOIN
(SELECT s.first_id, COUNT(*) as num_letters
FROM second s
WHERE s.letters IN ('aa', 'bb', 'cc', 'dd')
GROUP BY s.first_id
) s
ON s.first_id = f.id LEFT JOIN
(SELECT t.first_id, AVG(t.numbers) as avg_numbers
FROM third t
GROUP BY t.first_id
) t
ON t.first_id = f.id;