PHP5.3.1で使用しているMySQL5.1.44データベースがあります。
SELECT MAX(t1.tstamp) AS tstamp1, MAX(t2.tstamp) AS tstamp2 FROM table1 t1, table2 t2;
これは、両方のテーブルにコンテンツが含まれている場合は完全に機能しますが、テーブルの1つだけが空であっても、両方(!)に対してNULLを返します。table1に正しい値を返し、table2にnullを返さないのはなぜですか?
2 つのクエリを使用します。空のテーブルとのクロス結合では、行がゼロになります。
このような何かが仕事をするはずです
SELECT
(SELECT MAX(tstamp) FROM table1) AS tstamp1,
(SELECT MAX(tstamp) FROM table2) AS tstamp2;
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 ;
観察された動作は、テーブルの 1 つが空であることが原因である可能性があります。(テーブルの 1 つが空の場合、JOIN 操作は行を返しません。)
この問題を回避する 1 つの方法であるクエリを次に示します。
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
テーブル値のMAXを使用して見つけますテーブル間に関係がない場合は、個別のクエリを使用して最大値を見つけます