2

JSONデータを含むテーブルが2つある場合、MySQLデータベースから選択する方法を教えてください。それらの1つは次の構造を持っています:

Table Trees
(id, name, value) - three columns

以下のデータが含まれます

1,  trees, [{"name":"Oaktree","value":1,"target":null},{"name":"Appletree","value":2,"target":null},{"name":"Plumtree","value":3,"target":null}]
2,  length, [{"name":"10m","value":1,"target":null},{"name":"15m","value":2,"target":null},{"name":"20m","value":3,"target":null}]
3,  age, [{"name":"5y","value":1,"target":null},{"name":"10y","value":2,"target":null},{"name":"20y","value":3,"target":null}]

2番目のテーブルの構造は次のとおりです。

Table SelectedTrees
(properties) - only one column

これには次のデータが含まれます

[{"id":"1","value":["1","3"]},{"id":"2","value":["1", "2", "3"]},{"id":"3","value":["2"]}]

これは、Treesテーブルから選択されたデータを意味します。selectedTreesのプロパティ列のidは、 Treesテーブルのid列に対応します。データベースから次のような実際の(json_decoded)値を選択したいと思います。

木=オークツリー、プラムツリー

長さ=10m、15m、20m

年齢=10歳

どうすればこれを作ることができますか?前もって感謝します。

1月

4

1 に答える 1

4

一言で言えば、これは不可能です。リレーショナルデータベースは、インデックスを作成できる定数値をすばやく比較するために構築されています。JSONはMySQLの単なる文字列であり、あらゆる種類の部分的な文字列照合により、いわゆるテーブルスキャンがトリガーされます。これは、大量のデータを取得すると、本質的に非常に遅くなります。

あなたはそれをこのように動作させることができます:

SELECT * FROM Trees
JOIN SelectedTrees
  ON properties LIKE CONCAT('"id":"', Trees.id, '"')

ただし、これは本番システムでは絶対に使用したくないハックであり、テストシステムでは使用しないことをお勧めします。代わりに、データベースをリファクタリングして、クエリで照合するJSONがデータベースに存在しないようにします。二次データをJSONとして保存し、挿入する前にIDと名前が抽出されていることを確認してから、データベーステーブルの個別の列に挿入して、DBエンジンがリレーショナルマジックを実行できるようにすることは問題ありません。

于 2013-05-21T00:09:21.643 に答える