MySQL,根据JSON数组中的值选择记录

时间:2018-08-16 09:00:14

标签: mysql json database select mysql-5.7

我在处理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_*函数感到困惑;不确定要为第三个参数输入什么...

4 个答案:

答案 0 :(得分: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;
  

演示: https://www.db-fiddle.com/f/3DhoxmU7EApA1VvsyGfgpT/1

答案 1 :(得分:1)

使用JSON_SEARCH返回要搜索的元素的路径,如果找不到,则返回null:

SELECT *
FROM users
WHERE JSON_SEARCH(interestids, 'one', '2') IS NOT NULL

Live Demo

如果要使用简单的JSON数组存储多对多关系,则有更好的方法来实现。考虑创建user_interest表,并以正确且更简单的方式进行操作。也就是说,如果您的JSON实际上看起来像您向我们展示的那样,并且不包含动态键值对。

答案 2 :(得分:0)

SQL> select id 
from users 
where JSON_CONTAINS(interestIds, "2","$");
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.0015 sec)

答案 3 :(得分:0)

将选择内容包装到JSON_ARRAYAGG

赞:

SELECT JSON_ARRAYAGG(JSON_OBJECT(....)) FROM table....