我正在发出如下所示的请求:
SELECT main_table.*, <complicated calculation> AS computed_variable
FROM main_table
LEFT JOIN table1 ON main_table.id = table1.ref_id
LEFT JOIN table2 ON main_table.id = table2.ref_id
LEFT JOIN table3 ON main_table.id = table3.ref_id
GROUP BY main_table.id
HAVING computed_value > 1000
ORDER BY computed_variable ASC
这里的重要部分是复杂计算,即对不同的table3<进行SUM(类似于:SUM(table3.value * table3.duration))/em> 列。我应该注意到,绝对不可能将其从该 SQL 中丢弃,因为它用于排序和“具有”约束
我从未遇到过的问题 - 两个(或更多)联接(table1,table2)使得 table3 的 SUM 不正确。 据我所知 - 所有 table3 记录都被多次使用 -> 准确地说,是 COUNT(table1) * COUNT(table2) 次。
如果我错了,请纠正我。
因此 - 最终值 (compulated_variable) 比应有的值大得多。
问题是 - 如何解决这个问题?
P.S table1 和 table2 连接也无法删除。我需要它们来进行其他重要的计算和约束。
但是它们不使用任何复杂的聚合函数,因此它们的记录是否重复并不重要。
有办法解决这个问题吗?
P.S 对于那些想看示例的人:http://sqlfiddle.com/#!2/57333/4
最佳答案
您在沿多个维度连接时遇到问题,即行数相乘。假设复杂的计算仅来自table3
(正如您在问题中所描述的),您可以预先聚合结果:
SELECT m.*, <complicated calculation> AS computed_variable
FROM main_table m LEFT JOIN
table1
ON m.id = t1.ref_id LEFT JOIN
table2
ON m.id = t2.ref_id LEFT JOIN
(select t3.ref_id, <complicated calculation> AS computed_variable
table3 t3
group by t3.ref_id
) t3
ON m.id = t3.ref_id
GROUP BY m.id
HAVING computed_value > 1000
ORDER BY computed_variable ASC;
如果计算需要的话,您可能需要在子查询中包含更多表。
关于MySQL 多重连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25040974/