我在数据库中有一个JSON字段,它类似于: 【1,2,3,4,5,6,7,8,9,10,11,12】 我试着做一个查询,在那里我可以找到其他两个数组的组合,就像: [1,2,3,4]和[3,4,5,6] 我需要找到两个数组都有值的记录.现在,我正在为数组执行循环内循环,并调用查询,如:

$this->createQueryBuilder('g')
            ->select('
                g.tripId as tripId,
                g.routeId as routeId,
                g.stops as stops
            ')
            ->where("JSON_CONTAINS(g.stops, :firstStopId, '$') = true AND JSON_CONTAINS(g.stops, :lastStopId, '$') = true")
            ->setParameter('firstStopId', sprintf('"%s"', $firstStopId))
            ->setParameter('lastStopId', sprintf('"%s"', $lastStopId))
            ->getQuery()
            ->getArrayResult()

有什么办法可以优化这一点吗?也许有一种方法可以搜索Json字段是否有任何数组的值?

推荐答案

使用JSON_OVERLAPS().

mysql> set @a1='[1,2,3,4,5,6,7,8,9,10,11,12]';

mysql> set @a2='[3,4,5,6]';

mysql> set @a3='[7,9,11,13]';

mysql> select json_contains(cast(@a1 as json), cast(@a2 as json)) as contained;
+-----------+
| contained |
+-----------+
|         1 |
+-----------+

mysql> select json_contains(cast(@a1 as json), cast(@a3 as json)) as contained;
+-----------+
| contained |
+-----------+
|         0 |
+-----------+

mysql> select json_overlaps(cast(@a1 as json), cast(@a3 as json)) as overlapped;
+------------+
| overlapped |
+------------+
|          1 |
+------------+

如果你想真正优化它,请阅读MySQL的multi-valued indexes.

Mysql相关问答推荐

AWS RDS上的MySQL复制错误:超级权限或REPLICATION_SLAVE_ADMIN权限的访问被拒绝

MySQL生成的整型计算可以为空吗?

如何跨多个产品查找相同时间范围的数据集

如何在WooCommerce中更新pm_Virtual.meta_Value=#39;否

SQL MaxSum查询为列 Select 了不正确的值

为什么歌曲详细信息未显示在 Liked.handlebars 视图中?

避免多个SQL查询的重构代码

如何分解分组依据的数据?

如何在 axios 请求中将更新的设置状态值作为参数传递

Mysql JSON_REMOVE 数组键和值 (MariaDB)

如何计算每行的剩余金额?

插入二进制数据会导致Data too long for column...

为什么 fetch 方法不能获取任何东西?(feat node.js,restAPI)

在 MySQL 中 Select COUNT of MAX

插入重复键查询以在每一行上进行自定义更新

如何在 MySQL 中搜索多个列?

MySQL Workbench - 如何同步 EER 图

如何在mysql select查询中获取两个日期之间的日期列表

当运行 UPDATE ... datetime = NOW();所有更新的行都会有相同的日期/时间吗?

按 COUNT(*) 过滤?