【问题标题】:MariaDB JOIN based on JSON array基于 JSON 数组的 MariaDB JOIN
【发布时间】:2021-03-20 08:05:03
【问题描述】:

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

我想根据join_extract 搜索返回所有项目(我想)。

这些是从vendor_certs 表返回的值:

+----+-------------------+
| 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 表的SELECT

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

我正在寻找的输出是:

EPA, FDA

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

【问题讨论】:

  • 我调整了您的标签和问题标题,因为您使用的是 MariaDB,而不是 MySQL。这两种产品自 2010 年以来一直在慢慢分化,现在您应该将它们视为不同的软件。

标签: sql json mariadb where-clause mysql-json


【解决方案1】:

如果我没听错,你可以用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, '"'))
)

【讨论】:

  • 我得到“变量名是预期的。(靠近位置 116 的“?”)”
  • @DarioZadro: ? 代表查询的参数 - 我假设您只想过滤给定的vendor_key_value。如果这不相关,您可以删除该条件。
  • 我的错。现在我得到json_contains does not exist
  • @DarioZadro:是的,这需要 MariaDB 10.2.3:mariadb.com/kb/en/json_contains。在没有 JSON 函数的情况下操作 JSON 将是乏味的。有升级计划吗?
  • @DarioZadro:好吧,如果vendor_key_value 中有几行对于给定的id,那么您需要对meta_key 进行过滤。我更新了答案。
【解决方案2】:

我仍然会接受@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 连接的人。

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多