我有两张桌子:
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 |
+-------+-----------+
为什么会这样,我该如何解决? 谢谢:))
答案 0 :(得分:2)
将以下内容添加到查询末尾:
GROUP BY items.itemID
发生这种情况的原因是因为SQL引擎不知道您想要对每个itemId的amount列求和。它简单地总结了它们。如果你想改变这种行为,那就是GROUP BY的用途。这也适用于所有其他聚合函数(MIN
,MAX
,COUNT
等。
你可能会对自己说,“如果它不知道如何按我所说的选择(SELECT itemId ...
),那为什么它会返回值1
?”。这是一个很好的问题,而且返回的价值确实在大多数情况下都是不可预测的。实际上,它可能会在某个时刻开始在表中返回2
或其他itemId。因此,许多SQL引擎不允许您指定未包含在GROUP BY子句中的非聚合 - 也就是说,如果您尝试这样做,它们将抛出错误。 MySQL不关心这个窘境并返回结果,因为它可能是不可预测的。