删除GROUP BY时,MySQL查询返回的结果较少

时间:2011-08-25 21:53:36

标签: mysql group-by

我遇到包含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

感谢所有的想法!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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