如果这真的很基本,我很抱歉,但是:
我觉得在某些时候我没有遇到这个问题,现在我遇到了,所以要么我之前做了一些完全不同的事情,要么我的语法跳过了一步。
例如,我有一个查询,我需要返回具有特定数据的所有行以及具有这些列的总计的另一列。如果一切如我所料,它看起来像:
SELECT
order_id,
cost,
part_id,
SUM(cost) AS total
FROM orders
WHERE order_date BETWEEN xxx AND yyy
我会得到我的订单的所有行,并将总数添加到每行的末尾。我知道每次总数都是一样的,但这是预料之中的。现在为了让它工作,我正在使用:
SELECT
order_id,
cost,
part_id,
(SELECT SUM(cost)
FROM orders
WHERE order_date BETWEEN xxx AND yyy) AS total
FROM orders
WHERE order_date BETWEEN xxx AND yyy
基本上运行相同的查询两次,一次用于总数,一次用于其他数据。但是,如果我想要 SUM 和我不知道的平均成本,那么我会做同样的查询 3 次,这似乎是错误的,这就是为什么我认为我正在做一些非常基本的错误。
非常感谢任何帮助。
最佳答案
您需要使用 GROUP BY
这样才能得到你想要的结果:
SELECT
order_id,
part_id,
SUM(cost) AS total
FROM orders
WHERE order_date BETWEEN xxx AND yyy
GROUP BY order_id, part_id
这将对您的结果进行分组。请注意,由于我假设 order_id
和 part_id
是复合 PK,因此上面的 SUM(cost)
可能是 = cost
(因为您按保证唯一的两个字段的组合进行分组。下面的相关子查询将克服此限制)。
需要在 GROUP BY
行中指定获取的任何非聚合行。
有关详细信息,您可以在此处阅读有关 GROUP BY
的教程:
编辑:如果您想将一个列同时用作聚合和非聚合,或者如果您需要取消分离您的组,您将需要使用子查询:
SELECT
or1.order_id,
or1.cost,
or1.part_id,
(
SELECT SUM(cost)
FROM orders or2
WHERE or1.order_id = or2.order_id
GROUP BY or2.order_id
) AS total
FROM orders or1
WHERE or1.order_date BETWEEN xxx AND yyy
关于mysql - 聚合 MySQL 函数总是返回一行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1192019/