我正在发出如下请求:

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))。我应该注意,绝对不可能将其从此SQL中丢弃,因为它用于排序和“具有”约束

我从未遇到过的问题-两个(或多个)JOINS(表1,表2)使表3的SUM不正确。
据我所知-所有table3记录都被多次使用->
准确地说,是COUNT(table1)* COUNT(table2)次。

如果我错了纠正我。

因此-最终值(computed_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 - MySQL多重连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25040974/

10-11 08:04