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