聚合 MySQL 函数是不是总是返回单行?
Posted
技术标签:
【中文标题】聚合 MySQL 函数是不是总是返回单行?【英文标题】:Do aggregate MySQL functions always return a single row?聚合 MySQL 函数是否总是返回单行? 【发布时间】:2010-11-14 14:08:25 【问题描述】:如果这真的很基本,我很抱歉,但是:
我觉得在某些时候我没有这个问题,现在我有,所以要么我以前做的事情完全不同,要么我的语法跳过了一步。
例如,我有一个查询,我需要返回包含特定数据的所有行以及另一列,其中一个列的总数。如果事情按我的预期工作,它看起来像:
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 次,这似乎真的是错误的,这就是为什么我认为我正在做一些非常基本的错误。
非常感谢任何帮助。
【问题讨论】:
看起来你得到了很好的答案,但是以是或否答案形式陈述的问题并不是一个很有帮助的开始,恕我直言。 我倾向于写一些对他们来说非常模糊和定性的问题,所以这是我试图更精确的尝试。仍在微调。 【参考方案1】:您需要使用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
的教程:
mysql Tutorial - 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
【讨论】:
@Rax Olgud: 这是我从原始SELECT
复制和粘贴而没有检查字段。错误已更正。
而且您确实拥有编辑权限。无需为一个简单的错字劫持答案。
@Andrew:无意劫持,我很抱歉。
@Rax Olgud: 没问题...只是知道以备将来参考...除非答案基础完全错误,如果您有编辑权限,通常会被视为仅根据拼写错误发布与其他人内容相同的答案的不良礼仪。
@Andrew:我不同意错字的定义,但我不想卷入任何战争。我删除了我的回答并为你 +1。以上是关于聚合 MySQL 函数是不是总是返回单行?的主要内容,如果未能解决你的问题,请参考以下文章