【发布时间】:2020-10-14 15:19:04
【问题描述】:
我想创建一个简单的搜索引擎,可以计算与用户匹配的属性数量。
我正在使用一个 JSON 格式的字段来列出属性,当用户输入搜索时,它会以数组的形式获取。
我想将输入数组与 JSON 列表中匹配的属性数量进行比较。
并在两列中返回整体:第一列包含匹配的标签数。第二个包含匹配的标签列表。
这是我正在尝试做的一个真实的例子:
我想我必须使用 JSON_SEARCH 和 COUNT 的组合,但我似乎找不到正确的语法...
【问题讨论】:
我想创建一个简单的搜索引擎,可以计算与用户匹配的属性数量。
我正在使用一个 JSON 格式的字段来列出属性,当用户输入搜索时,它会以数组的形式获取。
我想将输入数组与 JSON 列表中匹配的属性数量进行比较。
并在两列中返回整体:第一列包含匹配的标签数。第二个包含匹配的标签列表。
这是我正在尝试做的一个真实的例子:
我想我必须使用 JSON_SEARCH 和 COUNT 的组合,但我似乎找不到正确的语法...
【问题讨论】:
一个选项是在 JSON 的整个键 (JSON_KEYS()) 中迭代地选取 (JSON_EXTRACT()) match_list 数组的成员,从第一个成员 (index-0) 开始直到长度 (@987654325 @) 以查找 (JSON_CONTAINS()) 是否存在于 JSON 列 (tags) 中。我使用information_schema.tables 来创建迭代,如下查询:
SET @match_list = '["talkative","cooker"]';
SELECT COALESCE( SUM( matched), 0 ) AS match_count
FROM
(
SELECT @i := @i + 1 AS rn,
JSON_CONTAINS(JSON_KEYS(tags),
JSON_EXTRACT(@match_list, CONCAT('$[',@i-1,']')),
'$') AS matched
FROM information_schema.tables
CROSS JOIN t
CROSS JOIN (SELECT @i := 0) r
WHERE @i < JSON_LENGTH(@match_list)
) q;
match_count
-----------
2
【讨论】: