MySQL - MAX()返回null

时间:2014-01-26 10:55:14

标签: 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));

现在返回:

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

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

修改

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

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

1 个答案:

答案 0 :(得分:4)

  1.   

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

    正如MySQL Extensions to 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;
    
         

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

         

    MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未在ORDER BY中命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。 服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。 此外,每个组中的值的选择不能是受添加ORDER BY子句的影响。选择值后会对结果集进行排序,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 不会影响服务器选择的每个组中的值。

  2.   

    我该如何解决?

    您要找的是group-wise maximum,可以通过将分组结果加回到表中来获得:

    {{1}}