MySQL 多重连接

标签 mysql sql join

我正在发出如下所示的请求:

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/

相关文章:

需要MYSQL索引吗?

Python-BeautifulSoup : How to save html into database?

mysql - mysql中3个表之间的关系

sql - 您如何记住/管理您的 SQL 示例?

mysql - 从多个表mysql中查找最近的日期

Mysql Foreach Child 在一行中显示 Max() 和 Min()

python - 表名 SQL 语法错误

sql - 如何更新 SQL Server 表中现有的 XML 字段数据?

sql - 两列的总和,并按另一列进行连接和分组

mysql - 如何使用 GROUP_CONCAT 在 GROUP BY 之后加入?