SQL:如果一个表为空,为什么多个表中的Max()会为所有内容返回NULL?

时间:2013-03-04 16:25:46

标签: php mysql sql null max

我有一个MySQL 5.1.44数据库,我正在使用PHP 5.3.1。

SELECT MAX(t1.tstamp) AS tstamp1, MAX(t2.tstamp) AS tstamp2 FROM table1 t1, table2 t2;

如果两个表都包含内容,则效果非常好,但即使只有一个表为空,也会为两个(!)返回NULL 。为什么它不是简单地为table1返回正确的值而为table2返回null?

4 个答案:

答案 0 :(得分:3)

使用两个查询 - 与空表交叉连接将导致零行

这样的事情应该做的工作

SELECT
    (SELECT MAX(tstamp) FROM table1) AS tstamp1,
    (SELECT MAX(tstamp) FROM table2) AS tstamp2;

答案 1 :(得分:1)

因为您正在交叉加入2个表格。 (中间)结果表具有(0 x N =0行。

您的查询是:

SELECT 
    MAX(t1.tstamp) AS tstamp1, 
    MAX(t2.tstamp) AS tstamp2 
FROM 
    table1 t1 CROSS JOIN table2 t2 ;

您可以通过运行2个子查询然后UNION来处理问题,这将返回0行,1行或2行:

SELECT 
    'table1' AS tablename, MAX(tstamp) AS tstamp
FROM 
    table1
UNION ALL 
SELECT 
    'table2' AS tablename, MAX(tstamp) AS tstamp
FROM 
    table2 ;

或者如果你想要一个表没有行,那么你需要严格的1行和NULL结果,你可以这样做:

SELECT 
    MAX(t1.tstamp) AS tstamp1, 
    MAX(t2.tstamp) AS tstamp2 
FROM 
    (SELECT 1) AS dummy
  LEFT JOIN table1 t1 ON TRUE 
  LEFT JOIN table2 t2 ON TRUE ;

或者这个:

SELECT 
    (SELECT MAX(tstamp) FROM table1)  AS tstamp1, 
    (SELECT MAX(tstamp) FROM table2)  AS tstamp2
FROM 
    dual ;

答案 2 :(得分:1)

您观察到的行为可能是由于其中一个表为空。 (如果其中一个表为空,则JOIN操作不会返回任何行。)

以下是一种解决问题的方法:

SELECT d1.tstamp1, d2.tstamp2
  FROM ( SELECT MAX(t1.tstamp) AS tstamp1 FROM t1 ) d1
 CROSS
  JOIN ( SELECT MAX(t2.tstamp) AS tstamp2 FROM t2 ) d2

答案 3 :(得分:0)

  1. 使用left join并找到表值的最大值
  2. 使用单独的查询
  3. 如果表之间没有关系,请使用单独的查询并找到最大值