Php 匹配MySQL JSON列的全部内容

Php 匹配MySQL JSON列的全部内容,php,mysql,json,laravel,database-design,Php,Mysql,Json,Laravel,Database Design,如何匹配整个MySQL JSON列的内容 e、 g 其中设置为JSON列类型。问题是当我在字段中存储JSON时,键的排列方式不同 当实际存在许多匹配项时,上面的操作将产生匹配项===0。您必须使用该函数 SELECT COUNT(id) as matches FROM my_table WHERE JSON_EXTRACT(`settings` , '$.color') = "red" AND JSON_EXTRACT(`settings` , '$.location') = "Australi

如何匹配整个MySQL JSON列的内容

e、 g

其中设置为
JSON
列类型。问题是当我在字段中存储JSON时,键的排列方式不同

当实际存在许多匹配项时,上面的操作将产生
匹配项===0

您必须使用该函数

SELECT COUNT(id) as matches
FROM my_table
WHERE
JSON_EXTRACT(`settings` , '$.color') = "red"
AND JSON_EXTRACT(`settings` , '$.location') = "Australia"
AND JSON_EXTRACT(`setting`, '$.flavour') = "cheese";
SELECT COUNT(id) as matches 
FROM my_table
WHERE JSON_CONTAINS(my_table.settings, '{ "color": "red", "location": "Australia", "flavour": "cheese" }')

我大部分时间都使用ORMs,所以我可能会混淆一些反勾号和引号,但我希望您能理解我的想法

答案是使用
JSON\u CONTAINS
函数

SELECT COUNT(id) as matches
FROM my_table
WHERE
JSON_EXTRACT(`settings` , '$.color') = "red"
AND JSON_EXTRACT(`settings` , '$.location') = "Australia"
AND JSON_EXTRACT(`setting`, '$.flavour') = "cheese";
SELECT COUNT(id) as matches 
FROM my_table
WHERE JSON_CONTAINS(my_table.settings, '{ "color": "red", "location": "Australia", "flavour": "cheese" }')
这适用于在不知道JSON结构的情况下搜索JSON的用例

在Laravel雄辩的ORM中,您将:

MyTable::whereRaw('JSON_CONTAINS(my_table.settings, ?)', json_encode($jsonString));

这种方法的问题是,我们需要知道高级json的内容……你打算如何匹配整个json列?你不知道要匹配什么?也许我误解了你的问题,但我的回答解决了你的代码示例。我在一个不知道其结构的变量中包含JSON。我在一列JSON中搜索,我不知道sorry的结构,但你没有任何意义。如果变量中有JSON,根据定义,您知道它的结构:
JSON\u decode()
。使用
JSON\u EXTRACT
的全部意义在于,您不需要知道数据库中JSON的结构。您只需匹配键和值,让数据库完成它的工作。很高兴您以适合您的方式解决了它!尽管我仍然不明白为什么我的答案有问题,但不管怎样。它现在可以工作了:)我知道MySQL现在支持JSON,但老实说,在一个列中存储序列化数据(JSON就是这样)仍然不是一个好主意,因为仅仅用SQL从序列化列中提取除最基本信息以外的任何信息都是一件非常麻烦的事情。是否可以重构数据库模式,以便以更容易查询的方式存储这些数据(例如附加的颜色、位置和味道列,或作为依赖表中的键和值)?不,是的,尽管适应频繁变化的模式的成本更高,但考虑使用不同的非SQL数据库可能是值得的?类似Mongo或Coach的东西?同样,与将真实世界的解决方案(见下文)与我们实际的主存储引擎集成相比,ops开销几乎不值得花费。您能认真地想象仅仅因为一个表上的一列而迁移整个应用程序吗?我的朋友是荒谬的本质。