MariaDB JOIN 基于 JSON 数组

MariaDB JOIN based on JSON array

我很确定这可以做到,但在搜索 MariaDB 文档后,我不确定如何做到。

我想 return 基于 join_extract 搜索的所有项目(我认为)。

这些是 return 来自 vendor_certs table 的值:

+----+-------------------+
| id | cert              |
+----+-------------------+
|  1 | Organic           |
|  2 | Kosher            |
|  5 | BRC               |
|  6 | SQF               |
|  7 | Halal             |
|  8 | ISO               |
|  9 | EPA               |
| 10 | NSF               |
| 11 | Walmart Certified |
| 12 | Target Certified  |
| 13 | FDA               |
+----+-------------------+

基于 vendor_key_value table 中的 SELECT:

+----+-----------+--------------+------------+
| id | vendor_id | meta_key     | meta_value |
+----+-----------+--------------+------------+
| 28 |        12 | vendor_certs | ["9","13"] |
+----+-----------+--------------+------------+

我正在寻找输出为:

EPA, FDA

任何帮助都会很棒。谢谢。

如果我没听错,你可以用json_contains()过滤:

select vc.*
from vendor_certs vc
where exists (
    select 1
    from vendor_key_value vkv
    where 
        vkv.id = ? 
        and vkv.meta_key = 'vendor_certs' 
        and json_contains(vkv.meta_value, concat('"', cv.id, '"')
)
)

如果您愿意,可以在结果集上应用聚合函数。假设您想要一个 JSON 数组:

select json_arrayagg(vc.cert)
from vendor_certs vc
where exists (
    select 1
    from vendor_key_value vkv
    where 
        vkv.id = ? 
        and vkv.meta_key = 'vendor_certs' 
        and json_contains(vkv.meta_value, concat('"', cv.id, '"'))
)

我仍然会接受@GMB 的回答,因为它让我走上了正确的轨道。

然而,在对 JSON 函数进行一些修改和阅读文档后,这对我来说更容易使用和理解。

SELECT cert
FROM vendor_certs
JOIN vendor_key_value
ON JSON_CONTAINS(vendor_key_value.meta_value, concat('"', vendor_certs.id, '"'))
WHERE meta_key = 'vendor_certs' AND vendor_id = 12

我不知道其他答案是否是更快的查询或有其他好处,但我希望我的答案能帮助其他可能陷入类似 JSON 连接的人。