php - 使用 MySQL 5.6 在 JSON 对象中搜索属性

标签 php mysql sql json

长话短说:我正在使用 MySQL 5.6(目前,不可能更新到更新的版本并使用改进的 JSON 功能),并且我有一个存储 JSON 的列。

存储在数据库中的示例 JSON 对象:

-- Row #1 (`options` column)
{"name": "Test", "description": "Some description", "type": "post", "scheduled": true, "deleted": false, "timestamp": "1482263883"}

-- Row #2 (`options` column)
{"name": "", "description": "Some description test", "type": "post", "scheduled": true, "deleted": false, "timestamp": "1482263883"}

问题:我希望能够根据存储在我的 JSON 对象中的 name 属性搜索记录。

SELECT * FROM `my_table` WHERE ((`options` LIKE '%"name":"%Test%"%'))

上面的查询工作正常,但有时它可能会返回误报(例如,将返回第二行,并且它在 description 属性中包含“test”字符串)。

一些注意事项:

  1. options 列中存储的对象对于每一行都完全相同,例如name 属性位于每条记录的第一位。

最佳答案

您可以使用正则表达式代替 LIKE。这允许您使用不会跨越字符串边界的模式,这与 LIKE

中的 % 通配符不同
SELECT * FROM my_table
WHERE options REGEXP '"name": *"[^"]*Test'

但是,如果一行包含以下内容,这可能会产生误报,而不是您得到的误报:

"name": "This is a \"quoted\" Test"

因为 [^"]* 不会遍历转义引号。

可能有一些方法可以改进正则表达式以允许这样做,但这并不简单。

关于php - 使用 MySQL 5.6 在 JSON 对象中搜索属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41250528/

相关文章:

php - 从 Jquery JSON 获取响应

用于目录列表的 PHP/MySQL 图像幻灯片

php - 将列值与嵌套选择进行比较

sql - 如何在bigquery查询上设置命名参数

php - 带有准备语句的多个 AVG

sql - 使用 to_date() 的 Oracle 查询得到 ORA-01858

php - 具有特定标准的笛卡尔积

php - 具有多个表的 Symfony sfDoctrinePager

mysql - knex 事务在 Nodejs 中不起作用

mysql - 社交网站的数据库设计。帮助!