【问题标题】:MySQL query returning fewer results when GROUP BY removed删除 GROUP BY 时 MySQL 查询返回的结果更少
【发布时间】:2011-08-25 21:53:36
【问题描述】:

我在处理包含 GROUP BY 的查询时遇到问题。作为诊断的一部分,我删除了 GROUP BY 语句以查看原始数据 - 但是当我这样做时,我得到 FEWER 行返回,我使用 GROUP BY。

复制:

CREATE TABLE `test1` (
  `date` bigint(20) DEFAULT NULL,
  `quantity` int(11) DEFAULT NULL,
  `processed` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
INSERT INTO `test1` VALUES (1312483084,3,2),(1312483084,1,2),(1312483148,1,2),(1312483148,1,2),(1314038654,1,2),(1314301805,1,2);

现在运行我原来的 SELECT(用 GROUP BY 完成):

SELECT DATEDIFF(from_unixtime(test1.date), from_unixtime(1311801510)) DIV 28 AS date_idx,
min(DATEDIFF(from_unixtime(test1.date), from_unixtime(1311801510))) AS orig_date_idx,            SUM(test1.quantity) AS num_items,
IF(test1.processed in (2,3,4), 'Complete','Pending') as status
FROM test1
GROUP BY status, date_idx \G

你应该得到两行返回:

*************************** 1. row ***************************
     date_idx: 0
orig_date_idx: 8
    num_items: 7
       status: Complete
*************************** 2. row ***************************
     date_idx: 1
orig_date_idx: 29
    num_items: 1
       status: Complete

现在删除 GROUP BY,即:

SELECT DATEDIFF(from_unixtime(test1.date), from_unixtime(1311801510)) DIV 28 AS date_idx,
min(DATEDIFF(from_unixtime(test1.date), from_unixtime(1311801510))) AS orig_date_idx,            SUM(test1.quantity) AS num_items,
IF(test1.processed in (2,3,4), 'Complete','Pending') as status
FROM test1

突然之间,您只返回了一行 - 原始结果中 date_idx == 1 的行已合并到 date_idx == 0 的条目中

*************************** 1. row ***************************
     date_idx: 0
orig_date_idx: 8
    num_items: 8
       status: Complete

感谢所有想法!

【问题讨论】:

    标签: mysql group-by


    【解决方案1】:

    坦率地说,我很惊讶它运行时没有给您一个错误,因为您使用没有 group by 的聚合函数,这可能与您的所有字段都是计算值这一事实有关。无论如何,摆脱所有聚合函数以获取基础数据。

    【讨论】:

    • 是的 - 我是个白痴。好眼力。本可以发誓 MySQL 不允许没有 GROUP BY 的聚合函数,所以我没有想到 :)
    【解决方案2】:

    您正在删除 GROUP BY 指令这一事实使得执行查询不需要在 date_idx 上细分您的结果。数字计数同样从 GROUPED 查询中的 1 和 7 变为 NON GROUPED 查询中的 8。如果没有 GROUPBY 指令,查询执行器就没有理由为您提供多于一行的聚合信息,因为您根本没有要求这种分隔。

    【讨论】:

      【解决方案3】:

      总和是一个聚合,因此正在为您折叠行。但是,在也使用 group by 子句的情况下,这是优先的,然后对不同的数据(来自分组)求和。在这种情况下,group by 会生成两个不同的集合,然后将它们相加。其他数据可能会返回与 group by 不同的结果。

      【讨论】:

      • 是的 - 我是个白痴。好眼力。本可以发誓 MySQL 不允许没有 GROUP BY 的聚合函数,所以我没有想到 :)
      猜你喜欢
      • 2020-02-06
      • 2021-12-15
      • 2014-04-28
      • 2011-09-30
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      相关资源
      最近更新 更多