MySQL_关于JSON数据的查询

Posted 飞廉灬少将

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL_关于JSON数据的查询相关的知识,希望对你有一定的参考价值。

导语

MySQL从5.7版本开始支持JSON格式的数据类型,JSON格式的字符串类型有如下优势:
1、存储在JSON列中的JSON文档会被自动验证。
无效的文档会产生错误;
2、最佳存储格式。
存储在JSON列中的JSON文档会被转换为允许快速读取文档元素的内部格式。

JSON格式的数据


	"classInfo": [
		
			"level": 1,
			"classId": 1472869278473637889,
			"parentId": 0,
			"typeGroups": 1472869277552140288
		,
		
			"level": 2,
			"classId": 1472869580589355009,
			"parentId": 1472869278473637889,
			"typeGroups": 1472869580531884032
		,
		
			"level": 3,
			"classId": 1472869739033382914,
			"parentId": 1472869580589355009,
			"typeGroups": 1472869738959134720
		,
		
			"level": 4,
			"classId": 1472875592394231810,
			"parentId": 1472869739033382914,
			"typeGroups": 1472875591372201984
		
	],
	"classValueInfo": 
		"specs": [],
		"basics": [
			
				"valueIds": [],
				"basicsType": "model",
				"typeGroups": []
			,
			
				"valueIds": [
					1470582565747314690
				],
				"basicsType": "内部品牌",
				"typeGroups": [
					1470582565592760320
				]
			,
			
				"valueIds": [],
				"basicsType": "适用品牌",
				"typeGroups": []
			
		],
		"skuSpecs": [
			
				"id": null,
				"price": 100,
				"skuCode": "1473137918587781120",
				"upcCode": "1",
				"inventory": 10,
				"skuSpecInfos": [],
				"thirdpartySkuCode": "1"
			
		],
		"attributes": [
			
				"type": "重要属性",
				"value": "1",
				"typeGroups": 1470588912652648448,
				"attributeId": 1470588912693956611,
				"valueIdList": []
			,
			
				"type": "重要属性",
				"value": "",
				"typeGroups": 1470589592058593280,
				"attributeId": 1470589592070541314,
				"valueIdList": [
					
						"valueId": 1470603255703789569,
						"valueIdTypeGroups": 1470602701724946432
					
				]
			
		]
	

表信息

CREATE TABLE `product` (
  `id` bigint NOT NULL,
  `site_code` varchar(16) COLLATE utf8mb4_general_ci NOT NULL COMMENT '站点代码',
  `product_code` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SPU代码',
  `product_features` longtext COLLATE utf8mb4_general_ci COMMENT 'SPU 商品特征',
  `product_m_describe` longtext COLLATE utf8mb4_general_ci COMMENT 'SPU M端描述',
  `product_pc_describe` longtext COLLATE utf8mb4_general_ci COMMENT 'SPU PC端描述',
  `product_class` json NOT NULL COMMENT '冗余的商品分类信息',
  `spec_type` tinyint NOT NULL COMMENT '规格类型 1=单规格 2=多规格',
  `url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '自定义Url',
  `up_time` datetime DEFAULT NULL COMMENT '上架时间',
  `down_time` datetime DEFAULT NULL COMMENT '下架时间',
  `sort` int NOT NULL DEFAULT '0' COMMENT '排序',
  `del_flag` tinyint NOT NULL DEFAULT '1' COMMENT '是否删除 0=删除,1=正常',
  `create_by` varchar(64) COLLATE utf8mb4_general_ci NOT NULL,
  `create_time` datetime NOT NULL,
  `update_by` varchar(64) COLLATE utf8mb4_general_ci NOT NULL,
  `update_time` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品分类'

表结构不是重点,终点是存在JSON数据类型的字段,将JSON格式数据粘贴到对应的字段中即可,上面的表结构中product_class为Json数据类型的字段

开始查询

SQL语句

SELECT * FROM product WHERE del_flag=1 
AND (JSON_CONTAINS(product_class>'$.classInfo',JSON_OBJECT('classId',1470584780293689347)) 
AND JSON_CONTAINS(product_class->'$.classInfo',JSON_OBJECT('classId', 1470585059726610434)) 
AND JSON_CONTAINS(product_class->'$.classInfo',JSON_OBJECT('classId', 1470592051933470721)))

查询结果

个人理解-关于SQL

JSON_CONTAINS(product_class->'$.classInfo',JSON_OBJECT('classId', 1470584780293689347))

官方文档中的解释
JSON_CONTAINS():JSON 文档是否包含路径中的特定对象
->:评估路径后从 JSON 列返回值;相当于 JSON_EXTRACT()。
JSON_OBJECT():创建 JSON 对象
SQL中包含的product_class是对应JSON格式的字段名,$.classInfo对应的是JSON数据中需要查询的列表,classId具体数据中的值

如果classInfo中包含有列表,name在查询的数据中classInfo的写法就要改变,继续"."下去,
例如:

'$.classInfo.A'

这里需要一直"."到你需要查询的那一级

结语

MySQL中关于JSON数据类型查询的方法当然不至这一种,有兴趣的可以具体去官网查看,
官网链接:MySQL官网-JSON函数参考

以上是个人理解,如果有不对的地方,希望博友指出

以上是关于MySQL_关于JSON数据的查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL_关于JSON数据的查询

关于sql模糊查询(全字段)

mysql json 嵌套数组查询

从循环查询 PHP MYSQL JSON 合并数组

laravel5.4 关于后台数组中数据和json数据在前台的遍历输出

将 MySQL 查询的 JSON 转换为 Object