MySQL - MAX() 返回 null

Mik*_*lty -1 php mysql sql max

我想从我的 mysql 数据库中获取每天的最高室外温度。它返回我的所有数据,但不返回外部温度。它始终为空。有人能帮我吗?这是mysql代码:

(SELECT MAX(tempOutside), tempInside, pressure, datetime 
 from weather 
 WHERE datetime BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE() 
 GROUP BY MONTH(datetime), DAY(datetime));
Run Code Online (Sandbox Code Playgroud)

现在返回:

null 18.4 1011 2014-01-23 00:15:04
null 19.2 1010 2014-01-24 00:00:05
null 19.6 1009 2014-01-25 13:15:02
Run Code Online (Sandbox Code Playgroud)

我的错误在哪里?一个解释会很好。谢谢

编辑:

我发现了错误。在我的 PHP 文件中我写了$row_array['tempOutside'] = ...在我更改 mysql 代码后MAX(tempOutside) AS tempOutside, ...它起作用了!

但我现在有一个新问题。它现在返回 maxOutSide 温度,但内部压力值和时间戳不是记录最大外部温度时记录的值。我该如何解决这个问题?应该是这样的:最大室外温度是在下午 5 点记录的 - 当时的内部和压力值是:...

egg*_*yal 5

  1. 它现在返回 maxOutSide 温度,但内部压力值和时间戳不是记录最大外部温度时记录的值。

    如MySQL 扩展GROUP BY(已添加重点)下所述:

    在标准 SQL 中,包含子句的查询GROUP BY不能引用选择列表中未在GROUP BY子句中命名的非聚合列。例如,此查询在标准 SQL 中是非法的,因为name选择列表中的列不会出现在GROUP BY

    SELECT o.custid, c.name, MAX(o.payment)
      FROM orders AS o, customers AS c
      WHERE o.custid = c.custid
      GROUP BY o.custid;
    
    Run Code Online (Sandbox Code Playgroud)

    为了使查询合法,name必须从选择列表中省略该列或在GROUP BY子句中命名该列。

    MySQL 扩展了 的使用GROUP BY,以便选择列表可以引用子句中未命名的非聚合列GROUP BY。这意味着前面的查询在MySQL中是合法的。您可以使用此功能避免不必要的列排序和分组,从而获得更好的性能。但是,这主要是在每个GROUP BY组中未命名的每个非聚合列中的所有值都相同时有用。服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则所选择的值是不确定的。此外,添加子句不会影响每个组中值的选择ORDER BY。结果集的排序发生在选择值之后,并且ORDER BY不会影响服务器选择每个组中的哪些值。

  2. 我该如何解决这个问题?

    您正在寻找的是分组最大值,可以通过将分组结果连接回表来获得:

    SELECT tempOutside, tempInside, pressure, datetime
    FROM   weather w JOIN (
      SELECT   MONTH(datetime) m, DAY(datetime) d, MAX(tempOutside) t
      FROM     weather 
      WHERE    datetime BETWEEN CURRENT_DATE - INTERVAL 30 DAY
                            AND CURRENT_DATE
      GROUP BY m, d
    ) t ON t.m = MONTH(w.datetime)
       AND t.d =   DAY(w.datetime)
       AND t.t = w.tempOutside
    
    Run Code Online (Sandbox Code Playgroud)