【问题标题】:MySQL, Select records based on values in JSON arrayMySQL,根据 JSON 数组中的值选择记录
【发布时间】: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_* 函数感到困惑;不知道第三个参数该放什么...

【问题讨论】:

    标签: mysql json database select mysql-5.7


    【解决方案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
        猜你喜欢
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 2014-02-15
        相关资源
        最近更新 更多