1

我有一个与 PHP 5.3.1 一起使用的 MySQL 5.1.44 数据库。

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

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

4

4 回答 4

3

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

像这样的东西应该做的工作

SELECT
    (SELECT MAX(tstamp) FROM table1) AS tstamp1,
    (SELECT MAX(tstamp) FROM table2) AS tstamp2;
于 2013-03-04T16:31:29.513 回答
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 ;
于 2013-03-04T16:33:54.147 回答
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
于 2013-03-04T16:36:48.893 回答
0
  1. 使用left join并找到表值的最大值
  2. 使用单独的查询

如果表之间没有关系,则使用单独的查询并找到最大值

于 2013-03-04T16:28:51.273 回答