带限制和偏移量的MySQL JSON_提取

带限制和偏移量的MySQL JSON_提取,mysql,sql,json,mariadb,Mysql,Sql,Json,Mariadb,假设我们有一列JSON数组,其中包含相对较多的元素: ---------------------------------------------------------------------- | | | user_id | badges | | ---------------------------------------------------------------------- | 123456

假设我们有一列JSON数组,其中包含相对较多的元素:

----------------------------------------------------------------------
|              |
|   user_id    |            badges 
|              |
----------------------------------------------------------------------
|    123456    |  '["a", "b","c", "d", ... "yz", "zz"]'
|    345678    |  '["1", "2","3", "4", ... "701", "702"]'
----------------------------------------------------------------------
有没有类似于在非JSON查询中使用LIMIT和OFFSET的方法,以小批量方式获取元素

例如:要获取51到61之间的元素:

SELECT badges->>$[*] FROM user_table WHERE user_id = '123456' LIMIT 10 OFFSET 50;

在MySQL 8+中,您可以使用
JSON_TABLE
将JSON数组拆分为行,创建一个额外的列,表示数组中的索引(从1开始)。然后可以在
WHERE
子句中使用该列。例如:

SELECT u.user_id,
       b.badge
FROM user_table u
JOIN JSON_TABLE(u.badges,
                '$[*]' COLUMNS
                (rn FOR ORDINALITY,
                 badge VARCHAR(20) PATH '$'
                 )) b
WHERE user_id = '123456' 
  AND b.rn BETWEEN 2 and 4
输出(用于示例数据)


另一方面,请注意,没有订单的限制对于详细的响应是毫无意义的。但是在每个请求上创建完整的表不是太麻烦了吗?特别是当徽章数组元素计数随时间增加时。@monroo
JSON\u TABLE
在限制输入时实际上是合理的。但是,如果您真的关心性能,您应该正确地将您的表标准化,并将徽章存储在
user\u-badges
表中(
id
user\u-id
badge\u-id
)。然后,您可以简单地使用“限制”和“偏移”来选择所需的行。
user_id     badge
123456      b
123456      c
123456      d