MySQL 过滤 JSON_CONTAINS 数组中的任何值

Posted

技术标签:

【中文标题】MySQL 过滤 JSON_CONTAINS 数组中的任何值【英文标题】:MySQL Filter JSON_CONTAINS Any value from Array 【发布时间】:2017-09-01 00:10:08 【问题描述】:

我在 mysql 数据库中有一个 JSON 字段,其中包含 [1,3,4,7] 之类的值。我希望能够轻松地从 php 变量中提供另一个数组并确定是否有任何重叠。我知道这个例子不起作用,但这是我想要做的:

$DaysVar = $_GET['Days']; --Example is [1,5,8]

$sql = mysqli_query($db, "
    SELECT ScheduleID, 
           Days --Example is [1,3,4,7]
    FROM Schedule
    WHERE JSON_CONTAINS(Days, '$DaysVar')
");

由于每个数组中都有一个 1,我如何让这个查询返回结果?

【问题讨论】:

请分享表格数据 所以你只想要结果中的重复值?或重复多少个值的计数器? 你用的是什么版本的Mysql? @JorgeCampos JSON_CONTAINS 仅适用于 5.7.8 或更高版本 【参考方案1】:

在 MySQL 5.7.8+ 上,您可以为每个单独的值执行 JSON_CONTAINS

SELECT * 
FROM   Schedule 
WHERE  (   JSON_CONTAINS(Days, '1')
        OR JSON_CONTAINS(Days, '2')
        OR JSON_CONTAINS(Days, '6')
       )

当要搜索的值存储在 PHP 变量中时——就像你的问题一样——那么你可以像这样构建上面的 SQL:

$DaysVar = $_GET['Days'];
$condition = implode(" OR ", array_map(function($day) 
    return "JSON_CONTAINS(Days, '$day')";
, $DaysVar));
$sql = mysqli_query($db, "
    SELECT ScheduleID, 
           Days
    FROM   Schedule
    WHERE  ($condition)
");

MySQL 8.*

从 MySQL 8 开始你可以使用JSON_OVERLAPS:

SELECT * 
FROM   Schedule
WHERE  JSON_OVERLAPS(Days, '$DaysVar')

【讨论】:

这无济于事,因为值将是动态的。 是的。我对 JSON 数组元素的动态计数有同样的问题。我需要 mysql-only 解决方案。你是如何解决这个问题的?【参考方案2】:

您可能找到了解决方案,但对于那些在未来寻找答案的人:

现在有JSON_OVERLAPS(),在您的示例中,您可以将其替换为JSON_CONTAINS()

https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#function_json-overlaps

【讨论】:

以上是关于MySQL 过滤 JSON_CONTAINS 数组中的任何值的主要内容,如果未能解决你的问题,请参考以下文章

JSON_CONTAINS 无法从 MySQL 中找到

MySQL JSON - 使用 IN 语句 | json_contains

mysql中json_contains和json_search的区别

MySQL - 搜索 JSON 数据列

GORM 判断 JSON 数组是否包含某元素

GORM 判断 JSON 数组是否包含某元素