MySQL,根据 JSON 数组中的值选择记录
Posted
技术标签:
【中文标题】MySQL,根据 JSON 数组中的值选择记录【英文标题】:MySQL, Select records based on values in JSON array 【发布时间】:2019-01-23 04:36:47 【问题描述】:我对在 mysql 中处理 JSON 字段还是很陌生。我遇到的所有解决方案都处理具有键/值的对象;找不到处理 JSON 数组的。
无论如何,我想要做的是能够选择其中interestIds
包含2
的所有行。我怎么做?谢谢。
用户表
+----+-------------+
| id | interestIds |
+----+-------------+
| 1 | [1, 2] |
| 2 | [3, 2] |
| 3 | [2, 4] |
+----+-------------+
示例测试查询:
SET @userId = 2;
SELECT * FROM Users
WHERE @userId IN JSON_CONTAINS(@user, interestIds, '$[1]');
我对如何使用JSON_*
函数感到困惑;不知道第三个参数该放什么...
【问题讨论】:
【参考方案1】:您可以使用以下解决方案,使用JSON_CONTAINS
:
SELECT *
FROM Users
WHERE JSON_CONTAINS(interestIds, '2') = 1;
第三个(可选)参数path
使您可以仅在JSON
值的特定部分使用此函数。所以下面的例子检查2
是否是数组的第二个值:
SELECT *
FROM test
WHERE JSON_CONTAINS(interestIds, '2', '$[1]') = 1;
demo on dbfiddle.uk
【讨论】:
【参考方案2】:使用JSON_SEARCH
返回您正在搜索的元素的路径,如果没有找到则返回null:
SELECT *
FROM users
WHERE JSON_SEARCH(interestids, 'one', '2') IS NOT NULL
Live Demo
如果您使用简单的 JSON 数组存储多对多关系,有更好的方法来做到这一点。考虑创建user_interest
表并以正确且更简单的方式进行操作。也就是说,如果您的 JSON 实际上看起来就像您向我们展示的那样,并且不包含动态键值对。
【讨论】:
问题包含 JSON,其中interestIds 是整数数组而不是字符串。 JSON_SEARCH 不适用于整数【参考方案3】:SQL> select id
from users
where JSON_CONTAINS(interestIds, "2","$");
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.0015 sec)
【讨论】:
【参考方案4】:将您的选择包装到JSON_ARRAYAGG
喜欢:
SELECT JSON_ARRAYAGG(JSON_OBJECT(....)) FROM table....
【讨论】:
只支持以上5.7.22
以上是关于MySQL,根据 JSON 数组中的值选择记录的主要内容,如果未能解决你的问题,请参考以下文章
获取mysql中的多条记录并存入json数组中显示在HTML表格单单字段中