1

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を返さないのはなぜですか?

4

4 に答える 4

3

2 つのクエリを使用します。空のテーブルとのクロス結合では、行がゼロになります。

このような何かが仕事をするはずです

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

観察された動作は、テーブルの 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
于 2013-03-04T16:36:48.893 に答える
0
  1. left joinテーブル値のMAXを使用して見つけます
  2. 別のクエリを使用する

テーブル間に関係がない場合は、個別のクエリを使用して最大値を見つけます

于 2013-03-04T16:28:51.273 に答える