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 连接的人。
我很确定这可以做到,但在搜索 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 连接的人。