Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-计数时的奇怪之处,我可以';无法解释_Sql_Mysql - Fatal编程技术网

MySQL-计数时的奇怪之处,我可以';无法解释

MySQL-计数时的奇怪之处,我可以';无法解释,sql,mysql,Sql,Mysql,通过一个简单的查询,我发现了两个非常不同的结果,我不确定我是如何得出这个结论的。下面是一个例子,请让我知道,如果这是我只是在看 SELECT b.fkid as t, b.timestamp, count(b.fkid) as hits, count(distinct(b.fkid)) as num, DATE_FORMAT( b.timestamp, '%Y-%m-%d' ) AS val1 FROM a, b WHERE

通过一个简单的查询,我发现了两个非常不同的结果,我不确定我是如何得出这个结论的。下面是一个例子,请让我知道,如果这是我只是在看

SELECT b.fkid as t, 
       b.timestamp, 
       count(b.fkid) as hits, 
       count(distinct(b.fkid)) as num, 
       DATE_FORMAT( b.timestamp,  '%Y-%m-%d' ) AS val1
  FROM a, b
 WHERE a.id = b.fkid
group by val1
…结果:

2 2009-09-25 08:33:42 **27** 3 2009-09-25
…与之相比:

SELECT b.fkid as t, 
       b.timestamp, 
       count(b.fkid) as hits, 
       count(distinct(b.fkid)) as num, 
       DATE_FORMAT( b.timestamp,  '%Y-%m-%d' ) AS val1
  FROM a, b
 WHERE a.id = b.fkid
group by t
…结果:

2  2009-09-25 08:33:42 **39** 1  2009-09-25 
3  2009-09-25 08:36:59 **6**  1  2009-09-25 
10 2009-09-25 22:40:14 **4**  1  2009-09-25
我不明白39+6+4=27是怎么回事?我希望第一个值是49而不是27。 还尝试:

SELECT b.fkid as t, 
       b.timestamp, 
       count(b.fkid) as hits, 
       count((b.fkid)) as num, 
       DATE_FORMAT( b.timestamp,  '%Y-%m-%d' ) AS val1
  FROM a, b
 WHERE a.id = b.fkid
group by val1
…产生:

2   2009-09-25 08:33:42     27      27      2009-09-25
根据下面的建议,我尝试删除不相关的数据并进行查询:

SELECT count(b.fkid) as hits, 
       count(distinct(b.fkid)) as num, 
       DATE_FORMAT( b.timestamp,  '%Y-%m-%d' ) AS val1
  FROM a, b
 WHERE a.id = b.fkid
group by val1
……这产生了:

27      3   2009-09-25
27      3
39      1
6   1
4   1
我试图将其简化为:

SELECT count(b.fkid) as hits, 
       count(distinct(b.fkid)) as num
  FROM a, b
 WHERE a.id = b.fkid
group DATE_FORMAT( b.timestamp,  '%Y-%m-%d' )
……这产生了:

27      3   2009-09-25
27      3
39      1
6   1
4   1
以及:

……这产生了:

27      3   2009-09-25
27      3
39      1
6   1
4   1

您正在计算不同的fkid值。是否有该值的副本?我想这可能会改变你的数字。

你在计算不同的fkid值。是否有该值的副本?我认为,这可能会改变您的数字。

在SQL中,您应该按所有非聚合字段分组,而不仅仅是val1


MySQL允许您不这样做(大多数其他数据库都会抛出错误),但它会给您带来不可预测的行为,特别是如果val1不能准确识别您正在生成的聚合。

在SQL中,您应该按所有非聚合字段分组,而不仅仅是val1


MySQL允许您不这样做(大多数其他数据库会抛出一个错误),但它会给您留下这样不可预测的行为,特别是如果val1不能准确地识别您正在生成的聚合。

在第一次查询中,您的分组是val1,这对所有记录都是一样的,因此,您只能看到非聚合函数的第一个值。

在第二个查询中,您将看到3个结果——不同fkid的数量


希望这有帮助。

在第一次查询中,您的分组方式为val1,这对所有记录都是相同的,因此您只看到非聚合函数的第一个值。

在第二个查询中,您将看到3个结果——不同fkid的数量



希望这能有所帮助。

通过格式化val1的日期,您可以获取具有不同时间戳(但相同日历日期)的记录并将其分组。又名“2009-12-01 01:00:00”和“2009-12-01 02:00:00”的时间戳,使用指定的日期格式格式化,两者都返回“2009-12-01”。但是,在第二次查询中,如果不按该日期格式分组,则记录将保持独立。

通过将日期格式化为val1,您将获取具有不同时间戳(但相同日历日期)的记录并将其分组。又名“2009-12-01 01:00:00”和“2009-12-01 02:00:00”的时间戳,使用指定的日期格式格式化,两者都返回“2009-12-01”。但是,在第二次查询中,由于没有按该日期格式分组,记录保持独立。

什么是“val1”?这是一个标准还是我不知道的东西?或者另一个fieldval1正在重命名日期\格式(b.时间戳,%Y-%m-%d),这样我就可以按val1分组,而不是按日期\格式(b.时间戳,%Y-%m-%d)分组。哦。。。向右滚动可能会有帮助吗?日期虽然没有显示,但可以携带毫秒数?@Frederico:请停止使用代码标记-这里的符号参考:什么是“val1”?这是一个标准还是我不知道的东西?或者另一个fieldval1正在重命名日期\格式(b.时间戳,%Y-%m-%d),这样我就可以按val1分组,而不是按日期\格式(b.时间戳,%Y-%m-%d)分组。哦。。。向右滚动可能会有帮助吗?日期虽然没有显示,但会有毫秒数?@Frederico:请停止使用代码标记-这里的符号引用:我尝试删除了distinct,但随后将计数中的值27(distinct(b.fkid))与原始的27值一起作为num。我尝试删除distinct,然而,随后计数中的值27(distinct(b.fkid))与原始的27值一起作为num。有很多“为什么在MySQL上运行时,我的db不能正常工作”的问题:/所以,为了确保我正确理解这一点,我应该按所有不正确的字段分组?在我的最后一个例子中,我已经这样做了,我应该做些不同的事情吗?再次感谢你。你应该做什么取决于你想要什么数据,上面给出的查询只提到它们会产生不同的结果,但我们需要知道你真正想要帮助的是什么数据。在研究了一段时间后,我意识到你需要的是聚合数据。我现在有了这个功能,并且意识到通过简单的t分组,它就是将所有数据分组在一起。我通过max(b.timestamp)发现了这一点,这表明实际上所有数据都是分组在一起的。很遗憾,是的,有选择的分组行为是MySQL设计的。有很多“为什么在MySQL上运行时,我的db不能正常工作”的问题:/所以,为了确保我正确理解这一点,我应该按所有不正确的字段分组?在我的最后一个例子中,我已经这样做了,我应该做些不同的事情吗?再次感谢你。你应该做什么取决于你想要什么数据,上面给出的查询只提到它们会产生不同的结果,但我们需要知道你真正想要帮助的是什么数据。在研究了一段时间后,我意识到你需要的是聚合数据。我现在有了这个功能,并且意识到通过简单的t分组,它就是将所有数据分组在一起。我通过max(b.timestamp)发现了这一点,这表明实际上所有数据都是分组在一起的。非常感谢。