我有一个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(!)。为什么它不简单地返回正确的值表1和空表2?
使用两个查询-与空表交叉连接将产生零行
像这样的东西应该能起作用
SELECT
(SELECT MAX(tstamp) FROM table1) AS tstamp1,
(SELECT MAX(tstamp) FROM table2) AS tstamp2;
因为您交叉连接了两个表。(中间)结果表有(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 ;
您观察到的行为可能是由于其中一个表为空。(如果其中一个表是空的,那么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
- 使用
left join
并找到表值的最大值 - 使用单独查询
如果表之间没有关系,则使用单独的查询查找最大值