MySQL、Select 记录基于 JSON 数组中的值

MySQL, Select records based on values in JSON array

我对处理 MySQL 中的 JSON 字段还是很陌生。我遇到的所有解决方案都处理具有 key/values; 的对象。无法找到处理 JSON 个数组的方法。

无论如何,我想要做的是能够 select interestIds 包含 2 的所有行。我怎么做?谢谢。

用户table

+----+-------------+
| 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_*功能感到困惑;不确定第三个参数应该放什么...

您可以使用以下解决方案,使用 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

使用 JSON_SEARCH 您要搜索的元素的 returns 路径,如果找不到则为空:

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

Live Demo

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

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

将你的 select 换成 JSON_ARRAYAGG

喜欢:

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