首页 > 解决方案 > 大型查询中的 JSON_CONTAINS

问题描述

提前道歉,我对 MySQL 中的 JSON 函数还是很陌生。

我有一个在结果中创建 json 对象的查询:

SELECT e.id as experiment,
     JSON_ARRAYAGG(
               JSON_OBJECT(
                           'id', c.id,
                           'type', c.type,
                           'value', c.value,
                           'taggable', 'experiments'
                            )
                          ) as tagList
FROM Experiments e
LEFT JOIN Taggings d ON e.id = d.taggableId AND d.taggable = 'experiments' AND d.deletedAt IS NULL
LEFT JOIN Tags c ON d.tagId = c.id
GROUP BY e.id;                           

它返回以下内容:

实验 标签列表
1 [{“id”:56680,“type”:“disciplines”,“value”:“农学”,“taggable”:“experiments”},{“id”:56670,“type”:“disciplines”,“value “:“植物施肥,动物和人类营养”,“标记”:“实验”}]
2 [{“id”:56693,“type”:“disciplines”,“value”:“Animal Communications”,“taggable”:“experiments”}]
3 [{“id”:5624,“type”:“disciplines”,“value”:“RNA”,“taggable”:“experiments”}]

如果表格未呈现,请使用此链接

我正在尝试使用JSON_CONTAINS标签值进行过滤,即:添加WHERE JSON_CONTAINS(tagList, '"Agronomy"', '$.value')以便我只返回实验 1(b/c 这是唯一一个带有 tagList 的实验,其中包含一个带有 value =“Agronomy”的对象。

但是,当我将 WHEN 语句添加到查询的末尾时,如下所示:

SELECT e.id as experiment,
     JSON_ARRAYAGG(
               JSON_OBJECT(
                           'id', c.id,
                           'type', c.type,
                           'value', c.value,
                           'taggable', 'experiments'
                            )
                          ) as tagList
FROM Experiments e
LEFT JOIN Taggings d ON e.id = d.taggableId AND d.taggable = 'experiments' AND d.deletedAt IS NULL
LEFT JOIN Tags c ON d.tagId = c.id
GROUP BY e.id
WHERE JSON_CONTAINS(tagList, '"Agronomy"', '$.value'); 

我得到错误 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE JSON_CONTAINS(tagList, '"Agronomy"', '$.value')' at line 14。我不确定我在这里做错了什么,我想也许在与 JSON_CONTAINS 相同的查询中运行 JSON AGG 会产生问题?任何帮助,将不胜感激!

标签: mysql

解决方案


测试源数据,而不是最终结果。

SELECT e.id as experiment,
       JSON_ARRAYAGG( JSON_OBJECT( 'id', c.id,
                                   'type', c.type,
                                   'value', c.value,
                                   'taggable', 'experiments' )) as tagList
FROM Experiments e
LEFT JOIN Taggings d ON e.id = d.taggableId AND d.taggable = 'experiments' AND d.deletedAt IS NULL
LEFT JOIN Tags c ON d.tagId = c.id
GROUP BY e.id
HAVING SUM(c.value = 'Agronomy')

推荐阅读