1
  1. JSON 文字列を含む「table_one」(MySQL) に「other」という名前の列があります。

  2. テーブルには数百万のレコードがあります。

  3. A. 「table_one」を反復処理し、「other」から読み取り、B. すべての $values をテーブル 2 (「table_two」) の対応する $key 列に挿入します。foreach $row (?)

  4. 「table_2」に列を作成済みです。

  5. 「table_one」から静的ファイル (/path/some.json) を作成したくない (と思う) のは、単純にデータベースから直接読み取るのに比べて効率が悪いように思われるからです。

  6. JSON の一部の値は null になり、一部のキーと値のペアが欠落します。したがって、$key(s) と $value(s) を「動的に」取得できること、およびそれらが存在しない場合にエラーが発生しないことが理想的/重要です。

「その他」の JSON のサンプル:

{"firstName": "Bob", "lastName": "Jones", "email": "bob.jones@yahoo.com", "address": "7206 maplehurst drive", "city": "PORT RICHEY", "状態": "FL", "zip": "34668", "ipAddress": "208.54.85.233", "性別": "M", "employer_name": "bobs auto", "months_address": "2" , "years_address": "12"}

あなた (私) は、これに対処するための標準機能があると思います。ありましたら、再度お詫び申し上げます。

現在、私は ETL ツールを使用して、シンプルだが巨大なトリム/分割/マップ プロセスを実行しています。各 JSON 文字列には 45 のペアがあります。また、テーブル構造を少し調整すると、全体を再マッピングする必要があります。

*PHP、MySQL、JavaScript、jQuery に対応。

4

3 に答える 3

4

110日前の質問に少し遅れましたが...

MySQL アドオン ライブラリである common_schema をご覧ください: http://code.google.com/p/common-schema/ XPath 指定子を使用する extract_json_value 関数があります。警告は、JSON 配列を解析せず (配列値をスペースで区切られた文字列として返すだけ)、配列内の引用符で囲まれていない数値を好まないように思われることです。

そして、はい、common_schema は他にも優れた機能を提供します。

より堅牢なのは、(整形式の) JSON 文字列を解析できるこの UDF です: https://github.com/kazuho/mysql_json

Ubuntu 10.04.4 LTS と MySQL 5.5.29 で簡単にコンパイルでき、非常に高速です。警告は、値ではない何かに解決されるときに文字列「オブジェクト」を返すことと、一連のプロパティ キーを指定する必要があることは、common_schemas.extract_json_value の XPath 指定子よりも扱いにくいことです。

更新: 残念ながら、common_schema は a) クローズドであり、b) MySQL 5.7 と互換性がありません。Percona はいつか更新するかもしれませんが、私は息を止めていません。

更新: MySQL 5.7.8+ には、ネイティブの JSON フィールドと関数があります。JSON 関数はパスを使用し、堅牢でかなり高速です。生成された (格納された) フィールドを使用した、やや精巧なインデックス作成の機会があります (仮想フィールドのインデックス サポートを期待しています)。警告 (5.7.9 現在): MySQL はキーの順序を変更する場合があり、重複したキーの後続の値は破棄されます (これは、重複したキーの前の値を破棄する他の多くの JSON ハンドラーとは異なります)。

于 2013-07-06T15:27:32.420 に答える
0

私は標準機能を認識していませんが、気分に基づいて2つの方法で行っています.

確実な方法: PHPスクリプトを書いてDBから読み込み、json_decodeでjsonデータを配列に変換し、最後にDBに書き戻す

クイックメソッド(私が怠け者の場合は適切な方法で): locateとsubstringを使用して、キーの後の値を次のキーまで取得します。

substring(task_time_breakup, locate('","key1":"', task_time_breakup)+7, locate('""}',task_time_breakup)-locate('","key1":"', task_time_breakup)-7 )
于 2013-03-18T17:02:17.560 に答える
0

mysql_json - JSON を解析するための MySQL UDF

インストール方法と使用例が記載されています: https://github.com/ChrisCinelli/mysql_json

于 2015-03-19T05:10:51.203 に答える