【发布时间】:2017-11-21 16:09:46
【问题描述】:
我有三张桌子。
对于每个“id”值,我想分别列出 col1 值的总和、col2 值的总和和 col3 值的总和。我不是跨表求和。
table a
num | id | col1
================
1 100 0
2 100 1
3 100 0
1 101 1
2 101 1
3 101 0
table b
idx | id | col2
=================
1 100 20
2 100 20
3 100 20
4 101 100
5 101 100
table c
idx | id | col3
==============================
1 100 1
2 100 1
3 100 1
4 101 10
5 101 1
我希望结果看起来像这样,
ID | sum_col1 | sum_col2 | sum_col3
====================================
100 1 60 3
101 2 200 11
这是我的查询,它运行时间过长然后超时。我的表大约有 25,000 行。
SELECT a.id as id,
SUM(a.col1) as sum_col1,
SUM(b.col2) as sum_col2,
SUM(c.col3) as sum_col3
FROM a, b, c
WHERE a.id=b.id
AND a=id=c.id
GROUP by id
Order by id desc
每个表中的行数可能不同,但每个表中“id”值的范围是相同的。
这似乎是一个类似的问题,但我无法使其工作,
【问题讨论】:
-
试试
Group By a.id和Order by a.id desc。您应该摆脱旧式连接并使用JOIN -
所有表格中是否总是包含所有 ID 号?或者是否存在表 a 的 ID 为 107 但在 b 或 c 中不存在的情况,表 b 有 199 但在 a 或 c 中不存在的情况等
-
列“id”的值在您的示例中不是唯一的。使用非唯一键加入数据将产生笛卡尔积,这可能是导致性能问题的原因。在连接中使用 a.num = b.idx 和 b.idx = c.idx。其他选项是在子查询中分别对每个表进行 SUM 并加入结果。
-
是的 - 所有表都有所有的 ID 号,但行数不一定相同。
-
然后加入解决方案将起作用..直到它不起作用(而联合解决方案将始终起作用)