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? @JorgeCamposJSON_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 数组中的任何值的主要内容,如果未能解决你的问题,请参考以下文章
MySQL JSON - 使用 IN 语句 | json_contains