3

アップデート

table3.noteサーバーでは列の値がNULLあり、ローカルマシンでは空の文字列であることに気づきました。この恥ずかしい発見の後、私はいくつかのテストを行い、すべてが両方のプラットフォームで同じように機能します。

そして、これは、2つのセルがあり、2番目のセルに実際の値が含まれている場合に生成されるものです(最初のセルはNULL):

//1st
GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `table3_note`
//var_dump(): array(2) { [0]=> string(0) "" [1]=> string(4) "Test" } 

//2nd
GROUP_CONCAT(`table3`.`note`) SEPARATOR ';') AS `table3_note`
//var_dump(): array(1) { [0]=> string(4) "Test" }

したがって、1番目のクエリ(COALESCE)はsを空の文字列として取得NULLし、2番目のクエリは結果セットからすべてのNULL値を削除します。(私は多くのアレイを持っており、それらを同期する必要があるため、これは受け入れられません。)

私のミスで元の問題は解決しました。チェックしてもsをGROUP_CONCAT無視する理由を知りたい。NULL

正しく機能するクエリは次のとおりです(sを削除しませんNULL)。

SELECT `table1`.*
  GROUP_CONCAT(COALESCE(`table3`.`id`, '') SEPARATOR ';') AS `t3_id`,
  GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `t3_note`,
  FROM `table1`
    LEFT JOIN `table3` ON `table3`.`id` = `table1`.`id`
      GROUP BY `table1`.`id`

では、なぜこれはNULLsを無視するのでしょうか。(値を無視するその他のクエリオプションNULLは、元の質問セクションにあります。)

SELECT `table1`.*
  GROUP_CONCAT(`table3`.`id` SEPARATOR ';') AS `t3_id`,
  GROUP_CONCAT(`table3`.`note` SEPARATOR ';') AS `t3_note`,
  FROM `table1`
    LEFT JOIN `table3` ON `table3`.`id` = `table1`.`id`
      GROUP BY `table1`.`id`

元の質問(重要ではありません、私の悪い...)

3つのテーブルを使用するクエリの一部(1:nの関係、単一の行table2との間で複数の行をマッピングしています)。単一のセル値をフェッチするための2つの方法:table3table1

 //1st
 GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `table3_note`

 //2nd
 GROUP_CONCAT(`table3`.`note`) SEPARATOR ';') AS `table3_note`

どちらもローカルマシンでは正常に動作しますが、サーバー上の最初のマシンでのみ動作します。私のローカルマシンでは、1番目または2番目のオプションを使用すると(を使用してvar_dump())、正しい量の空の配列値を取得します。サーバーでは、2番目のオプションは、値がない場合は空の配列のみを返します(クエリに表示されていないsやその他のフィールドtable3_noteが多数あります)。table3_id

だから問題はなぜですか?NULLマニュアルによると、null以外の値がない場合、両方の関数が戻ると主張します。

次の情報は関連性がありますか、それともマニュアルに何か欠けていますか?

  • ローカルマシン:MySQLクライアントAPIバージョン5.1.44
  • サーバー:MySQLクライアントAPIバージョン5.0.51a

答えは非常に単純なので、サーバーはCOALESCE私のローカルマシンのように機能を処理しますが、 GROUP_CONCATMySQLクライアントAPIのバージョンが一致しないため、関数の処理は異なりますか?

私は今、実用的な解決策を持っているので、これを修正する必要があるという意味で、これは本当の質問ではありません。なぜこれがそのままなのか知りたいのですが。COALESCEそして、私が使用しているように使用する際の落とし穴はありますか?forループを使用して配列を印刷するときに、配列が適切に同期されないという危険性はありますか?(少なくとも簡単なテストでは問題は見つかりませんでした。)


最後のメモ。IFNULL私はこれらの方法と、IS NULLたとえばこれらの質問で提案されているような他のいくつかの方法(など)を使用してみました。

しかし、結果は同じでした。ローカルマシンでは機能しますが、サーバーでは機能しません。以下のクエリ:

//another option for the query
IF(SUM(`table3`.`note` IS NULL) = 0, GROUP_CONCAT(`table3`.`note` SEPARATOR ';'), NULL) AS `table3_note`

//and another one...
ISNULL(GROUP_CONCAT(`table3`.`note` SEPARATOR ';'), '') AS `table3_note`

MySQLのマニュアルにも次のように書かれています

特に明記されていない限り、グループ関数はNULL値を無視します。

これは、チェックしても、のように値をCOALESCE無視しないという意味ですか?これでも、サーバーとローカルマシンの動作の違いについては説明していません。それともそうですか?NULLGROUP_CONCAT

4

1 に答える 1

3

適切に機能するクエリは次のとおりです (s を削除しませんNULL)。

SELECT `table1`.*
  GROUP_CONCAT(COALESCE(`table3`.`id`, '') SEPARATOR ';') AS `t3_id`,
  GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `t3_note`,
  FROM `table1`
    LEFT JOIN `table3` ON `table3`.`id` = `table1`.`id`
      GROUP BY `table1`.`id`

元の質問はそのまま残されています。非常に面倒で理解しにくいですが、上記のクエリは私にとってはうまくいきます。

于 2013-03-14T13:12:28.587 に答える