MySQL:有条件地从两个连接表中求和多个值

时间:2012-01-22 09:21:02

标签: mysql

这是我的问题的后续跟进:"MySQL: Querying a table and possibly replacing some fields with values from another table"

我有两张桌子。 Table1是我们的主要数据表,Table2有Table1列的子集和Table1中包含的记录的子集。您可以将Table2视为一个表,其中包含Table1记录的某些更正值。

以下是包含示例数据的表格:

表1

| page_id | field_id | date       | value | bla   |
--------------------------------------------------|
|     1   |      1   | 2012-01-01 |   3   |   1   |
|     2   |      1   | 2012-01-01 |   10  |   2   |
|     3   |      1   | 2012-01-01 |   25  |   2   |
|     1   |      2   | 2012-01-01 |   11  |   3   |
|     2   |      2   | 2012-01-01 |   22  |   1   |
|     3   |      2   | 2012-01-01 |   33  |   2   |

表2

| page_id | field_id | date       | value | 
-------------------------------------------
|     1   |      1   | 2012-01-01 |   1   |
|     2   |      1   | 2012-01-01 |   2   |
|     3   |      1   | 2012-01-01 |   3   |
|     4   |      1   | 2012-01-01 |   4   |

我想按照以下规则计算一个或多个field_ids的值的总和:

(1)如果指定的field_id之一的记录仅存在于Table1中,我想对其中field_id与指定的field_id匹配的所有记录的值和bla求和

(2)如果table1和Table2中都存在field_id,那么我们将得到Table2中的值和表1中bla的总和。

以下是我正在使用的查询:

SELECT t1.field_id,
SUM(IFNULL(t2.value, IFNULL(t1.value,0))) as 'Value Sum',
SUM(IFNULL(t1.bla,0)) as 'Bla Sum'
FROM test.Table1 t1
LEFT JOIN test.Table2 t2 ON t1.field_id = t2.field_id
WHERE (t1.field_id IN (1,2))
GROUP BY t1.field_id, t1.date;

但我没有得到field_1的正确总和:

|field_id | Value Sum  | Bla Sum| 
---------------------------------
|      1  |      30    |   20   | <-- was expecting 10 and 5, respectively 
|      2  |      66    |    6   |

你知道我可能做错了什么吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

你还需要将page_id添加到JOIN,否则table1的3行和table2的4为field_id1的结果为12列

SELECT t1.field_id,
SUM(IFNULL(t2.value, IFNULL(t1.value,0))) as 'Value Sum',
SUM(IFNULL(t1.bla,0)) as 'Bla Sum'
FROM test.Table1 t1
LEFT JOIN test.Table2 t2 ON t1.field_id = t2.field_id AND t1.page_id =t2.page_id
WHERE t1.field_id IN (1,2)
GROUP BY t1.field_id;

还按t1.date

删除了该群组