MySQL5.7 的 JSON 数组,数组元素是 Object,想查询该数组 Object 的某几个字段同时成立!求各位帮帮孩子,查一下午不知道怎么解决

2021-10-15 18:31:40 +08:00
 0x0208v0

因为业务从 mongodb 迁移到 mysql5.7,有一些 mongo 特殊的查询就需要修改。
想做到尽可能少改代码,并且需要支持 mongodb 的 $eleMatch 查询 (感觉难得不行)

CREATE TABLE `Student` (
  `id` bigint AUTO_INCREMENT PRIMARY KEY, 
  `name` varchar(64),
  `gender` varchar(32),
  `data` json DEFAULT NULL
) 

上面是简化后的表结构,实际上字段很丰富。主要是 data 字段是 JSON 格式,
大概长这样:

[
    {"date":"2021-01-01", "is_active": true, "tags":["A", "B", "C", "D"]},
    {"date":"2021-06-01", "is_active": false, "tags":["C", "D"]},
]

想查询如下:

  1. 名字为 “小明”,性别为“女”,

  2. data.date 在 2020-08-01 到 2020-05-01 之间,

  3. 并且 is_active 为 true,

  4. tags 中含有"C" 和 "D"的 -- 这个可以通过读到内存后过滤

查了一下午,试用了各种 json_extract 类似的函数,都没办法做到 [数组内的 Object 同时满足多个条件]

网上还有说用 mysql8.0 自带的 json_table 函数,,目前还没有测试,不知道能不能见索引。

求有经验的老哥说一下,跪谢跪谢跪谢跪谢跪谢跪谢跪谢

1620 次点击
所在节点    程序员
9 条回复
AlexaZhou
2021-10-15 18:44:21 +08:00
现在遇到问题:
没办法做到 [数组内的 Object 同时满足多个条件]

那么用多个 json 方法,每个方法判断一个条件,再用 where 条件一 and 条件二 ... 连接不就可以?
wuwukai007
2021-10-15 18:51:16 +08:00
json_contains + json_object
0x0208v0
2021-10-15 20:39:47 +08:00
@AlexaZhou 不行的
```
假如 data 的内容是这样的
[{"sub_timeoff_date": "2020-12-31", "actual_exchange_date": ""}, {"sub_timeoff_date": "2021-01-01", "is_confirm_exchange": false}, {"sub_timeoff_date": "2021-06-01"}]
```

那么这个 sql 查询就能匹配到
```

SELECT * FROM User
WHERE json_extract(data, '$[*].actual_exchange_date') = json_array('') and json_extract(data, '$[*].is_confirm_exchange') = json_array(false)
limit 1

```
moen
2021-10-15 21:45:49 +08:00
讲真,真要关系型数据库玩 json 为什么不用 PostgreSQL ?
0x0208v0
2021-10-16 10:00:53 +08:00
@moen 要是俺自己的项目,别说 PG 了,我用 SQLITE 都行
byaiu
2021-10-16 11:25:27 +08:00
建新表吧……
0x0208v0
2021-10-16 15:34:00 +08:00
@wuwukai007 试过了确实有些边界情况没办法满足
0x0208v0
2021-10-16 15:34:19 +08:00
@byaiu 看来只能新建了。。技术妥协
swcat
2021-10-17 00:30:31 +08:00
json_table 能做, 我做过, 性能不大好, 可能我用的方式不对

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/808090

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX