MySQL - 一个表的SUM正在加入另一个表

时间:2013-08-26 16:25:50

标签: php mysql sum

我有两张桌子:

1.items

+-------+---------+
|itemID | itemName|
+-----------------+
|1      | Item1   |
|2      | Item2   |
+-------+---------+

2.purchases

+-----------+--------+--------+-----------+
|purchaseID | userID | itemID | itemAmount|
+-----------+--------+--------+-----------+
|1          | 1      | 1      | 3         |
|2          | 2      | 1      | 4         |
|3          | 1      | 2      | 5         |
+-----------+--------+--------+-----------+

我的MySQL代码的简化版本是:

SELECT
    items.itemID,
    SUM(purchases.itemAmount)
FROM items
    LEFT OUTER JOIN purchases ON items.itemID = purchases.itemID

我希望结果如下:

+-------+-----------+
|itemID | itemAmount|
+-------------------+
|1      | 7         |
|2      | 5         |
+-------+-----------+

但相反,这就是结果:

+-------+-----------+
|itemID | itemAmount|
+-------------------+
|1      | 12        |
+-------+-----------+

为什么会这样,我该如何解决? 谢谢:))

1 个答案:

答案 0 :(得分:2)

将以下内容添加到查询末尾:

GROUP BY items.itemID

发生这种情况的原因是因为SQL引擎不知道您想要对每个itemId的amount列求和。它简单地总结了它们。如果你想改变这种行为,那就是GROUP BY的用途。这也适用于所有其他聚合函数(MINMAXCOUNT等。

你可能会对自己说,“如果它不知道如何按我所说的选择(SELECT itemId ...),那为什么它会返回值1?”。这是一个很好的问题,而且返回的价值确实在大多数情况下都是不可预测的。实际上,它可能会在某个时刻开始在表中返回2或其他itemId。因此,许多SQL引擎不允许您指定未包含在GROUP BY子句中的非聚合 - 也就是说,如果您尝试这样做,它们将抛出错误。 MySQL不关心这个窘境并返回结果,因为它可能是不可预测的。