0

我有 2 张桌子:

1.项目

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

2.采购

+-----------+--------+--------+-----------+
|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        |
+-------+-----------+

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

4

1 回答 1

3

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

GROUP BY items.itemID

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

您可能会对自己说,“如果它不知道如何按照我告诉它选择 ( SELECT itemId ...) 的内容进行分组,那么它为什么会返回值1?”。这是一个很好的问题,返回的值在大多数情况下确实是不可预测的。实际上,它可能会在某个时候开始返回2或在您的表中返回一些其他 itemId。出于这个原因,许多 SQL 引擎不允许您指定未包含在 GROUP BY 子句中的非聚合 - 也就是说,如果您尝试这样做,它们将引发错误。MySQL 不关心这个困境并返回一个结果,尽管它可能是不可预测的。

于 2013-08-26T16:30:23.490 回答