0

基本的に、nullの場合に列が0を返すようにします。ネストされたステートメント内でifnullを使用しています。ネストされたステートメントを単独で実行すると、列は0を返しますが、クエリ全体を実行すると、再びNULLになります。これは私のコードです:

SELECT Text, Verbo, Objeto, mPosts FROM Posts
    LEFT JOIN (SELECT ID, IFNULL(COUNT(*),0) AS mPosts FROM `Posts` WHERE Date >= DATE_ADD(CURDATE(), INTERVAL -30 DAY) GROUP BY `Verbo`,`Objeto`) AS B ON Posts.ID = B.ID

IFNULLをメインのselectステートメントに移動することはできますが、移動したくありません。

SELECT Text, Verbo, Objeto, IFNULL(mPosts,0) FROM Posts
    LEFT JOIN (SELECT ID, COUNT(*) AS mPosts FROM `Posts` WHERE Date >= DATE_ADD(CURDATE(), INTERVAL -30 DAY) GROUP BY `Verbo`,`Objeto`) AS B ON Posts.ID = B.ID

ネストされたステートメントでそれを実行できないのはなぜですか?メインクエリで使用する必要がないように、他の方法で実行できますか?

4

2 に答える 2

1

を取得NULLしている場合は、がの句と一致していないIFNULL(COUNT(*),0)ため、右側のテーブルのすべての値がになります。LEFT JOINONPosts.ID = B.IDNULL

そうですIFNULL、トップレベルのSELECT条項に移動する必要があります。

于 2012-09-13T17:48:47.560 に答える
0

IFNULL外側のクエリにが必要です。

内部クエリのCOUNT(*)inはNULLを返していません。左側の行に右側の行ソースからの一致する行がない場合、NULLはLEFTJOIN操作によって作成されています。

このクエリはあなたのクエリと同等です:

SELECT a.Text
     , a.Verbo
     , a.Objeto
     , c.mPosts
  FROM `Posts` a
  LEFT
  JOIN ( SELECT b.ID
              , COUNT(*) AS mPosts
           FROM `Posts` b
          WHERE b.Date >= DATE_ADD(CURDATE(), INTERVAL -30 DAY)
          GROUP BY b.`Verbo`, b.`Objeto`
       ) c
    ON c.ID = a.ID

再フォーマットされたクエリにより、問題がどこにあるかがより明確になります。

インラインビュー(サブクエリ)は、GROUP2つの列に対してBYを実行しID、各カウント値に含まれる1つの行からの値を返します。

(他のリレーショナルデータベースは、このステートメントで「group byにない選択リストに非集約」タイプの例外をスローします。この場合、MySQLはよりリベラルであり、便利であり、呪いでもあります。)

クエリによって返される結果セットはかなり奇妙です。ここでどの結果セットを返すかは明確ではありません。

「count」サブクエリの行は、COUNT()の各値に含まれる1つの行のみと一致します。(COUNT(*)が1より大きい場合は常に、インラインビューからの一致する行がない行が外部クエリに存在します...GROUPBYはのすべてのID値を折りたたみます含まれている行から、含まれている1つの行の1つのID値まで。

あなたが何を返して欲しいのかはっきりしないので、私は提案をすることを躊躇します。

あなたができることの1つは、WHERE句から述語を削除し、代わりに次のように集約でその条件をチェックすることです...

SELECT a.`Text`
     , a.`Verbo`
     , a.`Objeto`
     , c.`mPosts`
  FROM `Posts` a
  LEFT
  JOIN ( SELECT b.ID
              , SUM(IF b.`Date` >= DATE_ADD(CURDATE(), INTERVAL -30 DAY)) AS `mPosts`
           FROM `Posts` b
          GROUP BY b.`Verbo`, b.`Objeto`
       ) c
    ON c.ID = a.ID

これにより、NULL値の数が減る可能性がありますが、LEFT JOINが、右側から一致しない左側の行に対してNULLを生成するというより基本的な問題には対処していません。

于 2012-09-13T18:23:29.373 に答える