0

chat他のすべてのテーブルからどのメッセージが読み取られたかを制御するテーブルがあります。新しいユーザーのために、新しい値を挿入しています。

INSERT INTO chat VALUES (1,aaa,bbb,ccc)
SELECT
MAX(chatA.postOrder) AS aaa,
MAX(chatB.postOrder) AS bbb,
MAX(chatC.postOrder) AS ccc
FROM `chatA`, `chatB`, `chatC`
WHERE 1

ChatBとの場合ChatC、postOrder が存在し、両方に値があります。すべてが正しく機能します。問題は、チャットが空である場合があることです (この場合はchatA)。これが発生するbbbccc、NULL になります。この行を削除しMAX(chatA.postOrder) AS aaa,ても、値は NULL のままです。

私はここで立ち往生しており、この問題を解決する方法がわかりません。などの選択フィールドで行われた変更はIFNULL(chatA.postOrder,0) AS aaa,、結果には影響しません。chatAin the FROMfield により、 と の結果bbbcccNULL になるようです。

編集:フォーマット

4

2 に答える 2

0

これらのテーブルのいずれかが空の場合に行を返すようにするには、次のようにすることができます。

SELECT MAX(IF(t.chat='a',t.postOrder,NULL) AS aaa
     , MAX(IF(t.chat='b',t.postOrder,NULL) AS bbb
     , MAX(IF(t.chat='c',t.postOrder,NULL) AS ccc
  FROM ( SELECT 'a' AS `chat`, MAX(ta.postOrder) AS postOrder FROM `chatA` ta
          UNION ALL
         SELECT 'b', MAX(tb.postOrder) FROM `chatB` tb
          UNION ALL
         SELECT 'c', MAX(tc.postOrder) FROM `chatB` tc
       ) t

注:インライン ビュー (上記のエイリアスが割り当てられている) は、3 つのテーブルのそれぞれtから最大の postOrder を返します。テーブルが空の場合 (行がない場合)、そのテーブルからの THE SELECT は行を返しません。ただし、行は演算子と一緒に連結されるためです。これにより、外部クエリが選択できる単一の結果セットが得られます。各行に、行が返されたテーブルを識別する定数リテラル識別子 ( 、または) を追加します。UNION ALL'a''b''c'

外側のクエリの「トリック」は、識別子列をテストし、postOrderその列が で指定された列と一致する場合にのみ値を返すことIFです。それ以外の場合は、NULL を返します。その IF() 式を MAX() 集計関数でラップすると、3 つの行が事実上 1 つの行に折りたたまれます。


あなたのクエリは効果的です:

SELECT MAX(a.postOrder) AS aaa
     , MAX(a.postOrder) AS bbb
     , MAX(a.postOrder) AS ccc
  FROM `chatA` a
 CROSS
  JOIN `chatB` b
 CROSS
  JOIN `chatC` c

JOIN 操作のため、これら 3 つのテーブルのいずれかが空の場合 (行を返さない場合)、クエリは行をまったく返しません。

于 2013-08-19T04:34:38.120 に答える