场景:
您正在使用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"}, {"text": "Synthetic (Old Type - Hard)", "value": "3"}, {"text": "Gravel", "value": "5"}, {"text": "Clay", "value": "6"}, {"text": "Sand", "value": "7"}, {"text": "Grass/Synthetic Mix", "value": "8"}]' );</code>
挑战:
您需要根据以下选项从选项字段中选择“草”文本值:搜索值“1”。
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;</code>
此查询使用交叉联接和 JSON_TABLE() 来检索选项字段中每个对象的文本和值列。
与 JSON_TABLE 相关的问题:
但是,使用 JSON_TABLE() 可能很复杂,并且每次需要这样的查询时都必须重复。
建议:
而不是使用 JSON,它可以更简单地将数据存储在具有文本和值对专用列的表中。这将允许使用常规 SQL 语法进行直接搜索:
<code class="sql">SELECT * FROM field_options WHERE value = '1';</code>
以上是如何通过键值从 MySQL 表中的 JSON 字段中检索特定对象?的详细内容。更多信息请关注PHP中文网其他相关文章!