代码之家  ›  专栏  ›  技术社区  ›  stogdilla

为什么我的mysql文件不是按小时分组,而不是按半小时分组,不显示相同的数据?

  •  0
  • stogdilla  · 技术社区  · 16 年前

    我需要能够以15分钟的增量显示不同显示类型的数据。我有两个问题给我带来麻烦。一个按半小时显示数据,另一个按小时显示数据。唯一的问题是查询之间的数据总计会发生变化。它不计算时间帧之间发生的数据,只计算时间帧。

    前任: 早上7点15分有5件事发生。早上7:30发生2次,早上7:00演出4次。

    15分钟视图显示所有数据。 半小时视图显示上午7:00和上午7:30的数据,但忽略7:15。
    小时显示仅显示上午7:00的数据

    以下是我的问题:

    $query="SELECT * FROM data WHERE startDate='$startDate' and queue='$queue' GROUP BY HOUR(start),floor(minute(start)/30)";
    

    和

    $query="SELECT * FROM data WHERE startDate='$startDate' and queue='$queue' GROUP BY HOUR(start) ";
    

    我如何才能像我一样分组提取数据,但要包括所有数据?

    问题是数据存储在mysql表中的方式吗?目前,我有一个日期栏(2010-03-29)和一个时间栏(00:00),我需要将这些转换成其他内容吗?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Marc B    16 年前

    你把“分组依据”解释错了。您不需要将多个记录“分组”,这样您就可以用单个记录来获取所有记录。 fetchrow() 打电话。发生的情况是,数据库将把与group by子句匹配的所有记录折叠为一条记录。取一个简单的游戏计分表:

    id   playername  score
    ----------------------
    1    John        23
    2    Fred        12
    3    Jack        9
    4    John        18
    

    如果您执行了以下查询: SELECT id, playername, score FROM table GROUP BY playername ,您将得到以下结果集:

    id   playername  score
    ----------------------
    1    John        23
    2    Fred        12
    3    Jack        9
    

    嘿!约翰去哪儿了?他消失了,因为ID为4的行与group by子句匹配,并且已经折叠到第一行中被发现匹配(1)。本身不是很有用,现在您已经丢失了与ID_4相关的所有数据。但这就是聚合函数(sum、count、average等)发挥作用的地方: SELECT id, playername, SUM(score) FROM table GROUP BY playername :

    id   playername  score
    ----------------------
    1    John        41   <---notice the change (23 + 18 = 41)
    2    Fred        12
    3    Jack        9
    

    通过您的查询,您有两个选择:

    1. 保持分组方式不变,对查询中分组的数据进行任何计算(求和、计数、求平均等),以便获得每个匹配时间段的聚合结果。
    2. 删除group by子句,执行应用程序中所需的任何计算
    3. 将group by子句转换为查询中的结果字段,以便您可以基于这些新列处理代码中的每个期间: SELECT *, HOUR(start), FLOOR(MINUTE(start)/30) FROM data
        2
  •  1
  •   Frank Heikens    16 年前

    group by错误,查询中不使用任何聚合函数。除去group by,数据库现在必须猜测它应该选择哪些记录。数据库不应该猜测,他们必须得到正确的答案,只有正确的答案。

    改变 SQL MODE 并创建正确的查询。

    推荐文章