为什么在这个简单的查询中求和的结果加倍?

时间:2013-12-09 20:00:08

标签: mysql sql database

mysql> create table a (
    -> id varchar(10),
    -> val int
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> create table b (
    -> id varchar(10),
    -> val int
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into a values ('a', 1), ('b', 2), ('c', 3);

mysql> insert into b values ('a', 4), ('a', 5), ('b', 6), ('b', 7), ('c', 8), ('c', 9);

mysql> select a.id, sum(a.val), sum(b.val) from a inner join b on a.id = b.id group by a.id;
+------+------------+------------+
| id   | sum(a.val) | sum(b.val) |
+------+------------+------------+
| a    |          2 |          9 |
| b    |          4 |         13 |
| c    |          6 |         17 |
+------+------------+------------+
3 rows in set (0.00 sec)

我的预期结果是sum(a.val)呈现1,2和3,sum(b.val)呈现9,13和17。

我应该如何重写查询以获得预期的结果?

2 个答案:

答案 0 :(得分:0)

以下是在执行group by和sum之前的连接查询的结果:

a.id    a.val    b.val
----    -----    -----
a       1        4
a       1        5
b       2        6
b       2        7
c       3        8
c       3        9

如您所见,a.id ='a'的所有行的总和(a.val)将给出2,因为有2行。所以结果是[2,4,6],而不是[1,2,3]。

答案 1 :(得分:0)

这是由于JOIN与另一个表。

如果您只使用JOINS运行简单查询但没有SUM,您将看到表A中的记录被加倍,因为您使用表B INNER JOIN

A.ID    A.val    B.val
 a       1        4
 a       1        5
 b       2        6
 b       2        7
 c       3        8
 c       3        9

为了获得预期的结果,您必须像这样查询:

SELECT 
    A.ID, 
    A.VAL 'A Sum', 
    B.VAL 'B Sum'
FROM
(SELECT ID, SUM(VAL) AS 'VAL' FROM A GROUP BY ID) A INNER JOIN
(SELECT ID, SUM(VAL) AS 'VAL' FROM B GROUP BY ID) B ON A.ID = B.ID

以下是SQLFiddle,了解此查询的工作原理。