如何在MySQL查询本身中检索JSON数组中存储的值?

如何在MySQL查询本身中检索JSON数组中存储的值?,mysql,sql,json,Mysql,Sql,Json,我有下表 product_id product_name image_path misc ---------- -------------- ------------ ------ 1 flex http://firstpl... {"course_level_id":19,"group_id":"40067"}

我有下表

product_id    product_name    image_path                             misc
----------   --------------  ------------                           ------
     1            flex        http://firstpl...      {"course_level_id":19,"group_id":"40067"}
     2           Android      http://firstpl...      {"course_level_id":20,"group_id":"40072"}
那么如何从“misc”列中检索产品名称、图像路径和仅“group\u id”值,如“40067”

我尝试了下面的查询,但它在Misc列中返回1/0

SELECT product_name,image_path,misc REGEXP '(.*\"group_id\":*)' as Misc FROM ref_products where product_id=1

你知道怎么做吗?

函数只返回0或1。您必须使用其他字符串函数

试试这个:
substr(misc,locate('group_id',misc)+11,5)作为misc
。但这假设组id始终有5个字符

所以这更好:
substring\u index(substr(misc,locate('group\u id',misc)+字符长度('group\u id')+3),'“,1)作为misc

下面是一把小提琴,显示它的工作原理:

编辑您可以通过在字符串中包含双引号和冒号来摆脱
+3
幻数,如下所示:
substring\u index(substr(misc,locate(“'group\u id:”,misc)+char\u length(“'group\u id:”),“'”,1)作为misc

您可以为MySQL使用一个通用的\u架构框架(与所有MySQL>=5.1兼容),然后通过这种方式获得所需的内容:

SELECT x.product_name, x.image_path, common_schema.extract_json_value(x.misc,'/group_id') as group_id FROM your_table x

公共模式框架:

自从提出这个问题以来,MySQL已经引入了对JSON数据类型的支持

在MySQL 5.7.8(及更高版本)中,您可以使用
JSON\u EXTRACT()
或等效的
->
别名查询存储在列中的实际JSON字符串

例如:


请参阅:

首先,您不应该将其存储在json中。不,这是一种简单的方法,而不是在一列中添加更多的列存储。如果有解决办法的话welcome@RIADev-很简单:把数据放进去,然后你就不能再把它拿出来了。您应该将这些数据存储在单独的列中。@MikeW我在这里发布了一个示例数据。无法更改、添加列和迁移数据。所以我迫切需要一个解决办法。不,@zerkms没有生气,他是对的。如果要查询值,请将其存储在列中。否则,为什么不在每个表中都有一个巨大的varchar列,其中包含所有内容呢?我相信应该注意,这是非常奇怪的。这是数据库中的数据,您应该在代码中使用它(而不是在数据库中)。否则,您甚至可能会在该值上进行
JOIN
。如果您真的需要在SQL中包含这段特定的数据点,那么您应该将其保存为一段,而不是将此JSON保存在列中。@Nanne我不明白您的意思。以JSON格式保存数据是否真的很糟糕。是的。见@zerkms和我对这个问题的评论。你可以做你正在做的事。你可以让它工作。但是使用数据库是错误的,使用关系数据库是有原因的。如果您需要JSON格式(例如,在您希望保存发送给用户的确切JSON的情况下),它可能是有用的,但在这种情况下不是,正如您希望在查询中从JSON获取一个值所演示的那样。事实并非如此,你可能遇到的问题之一正是你现在面临的问题:你想要某样东西,但却很难得到。现在,如果您不能更改任何内容,那么只需在代码中执行,而不是在数据库中。这应该更容易些(比如解析为json)@Nanne现在我明白你的意思了。看,我们正在做一个项目,客户总是给出一个变更请求,所以当我们不能说我们必须在DB中添加两列时,这将很尴尬。客户端正在使用的服务器只能访问。因此,我们决定不添加列,而是做一些不同的操作。原来是这样。它在我的情况下工作完美谢谢。
SELECT product_name, image_path, JSON_EXTRACT(misc,'$.group_id') AS `group_id` 
FROM ref_products 
WHERE product_id=1