問題:
MySQL データベースで JSON データを操作する場合、どうすれば効率的に取得できますか別のキーを使用してクエリを実行しながら、キー値に基づいて特定のオブジェクトを検索しますか?
スキーマ:
次のスキーマの例を考えてみましょう:
<code class="sql">CREATE TABLE `fields` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `label` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, `options` json DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;</code>
<code class="sql">INSERT INTO `fields` (label, options) VALUES ( 'My Field', '[{"text": "Grass", "value": "1"}, {"text": "Synthetic (New Type - Soft)", "value": "2"}, ...]');</code>
目的:
フィールドの ID を指定して、その値に基づいて特定のオプションの対応するテキスト値を取得します。
前解決策:
最初の試みでは、JSON 関数を組み合わせて使用しました。ただし、これらのアプローチは面倒で、複雑な式が必要でした。
JSON_TABLE() 関数 (MySQL 8.0):
MySQL 8.0 では、JSON_TABLE() 関数が導入されました。プロセス:
<code class="sql">SELECT field_options.* FROM fields CROSS JOIN JSON_TABLE(fields.options, '$[*]' COLUMNS( text TEXT PATH '$.text', value TEXT PATH '$.value' ) ) AS field_options WHERE field_options.value = 1; +-------+-------+ | text | value | +-------+-------+ | Grass | 1 | +-------+-------+</code>
非 JSON 代替:
より簡単な解決策は、JSON データを正規化されたテーブルに変換することです:
<code class="sql">CREATE TABLE `field_options` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `field_id` int(10) unsigned NOT NULL, `text` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, `value` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`field_id`) REFERENCES `fields`(`id`) );</code>
<code class="sql">INSERT INTO `field_options` (field_id, text, value) VALUES ( 1, 'Grass', '1'), (1, 'Synthetic (New Type - Soft)', '2'), ... );</code>
このアプローチにより、従来の SQL 手法を使用した効率的な検索が可能になります。
<code class="sql">SELECT * FROM `field_options` WHERE value = '1';</code>
以上がキー値に基づいて MySQL の JSON オブジェクトからテキスト値を効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。