アップデート
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`
では、なぜこれはNULL
sを無視するのでしょうか。(値を無視するその他のクエリオプション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つの方法:table3
table1
//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以外の値がない場合、両方の関数が戻ると主張します。
- http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce
- http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
次の情報は関連性がありますか、それともマニュアルに何か欠けていますか?
- ローカルマシン:MySQLクライアントAPIバージョン5.1.44
- サーバー:MySQLクライアントAPIバージョン5.0.51a
答えは非常に単純なので、サーバーはCOALESCE
私のローカルマシンのように機能を処理しますが、 GROUP_CONCAT
MySQLクライアント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`
特に明記されていない限り、グループ関数はNULL値を無視します。
これは、チェックしても、のように値をCOALESCE
無視しないという意味ですか?これでも、サーバーとローカルマシンの動作の違いについては説明していません。それともそうですか?NULL
GROUP_CONCAT