我有一张表格,里面有我们从各种来源收集的数据。它有项目名称、来源和来源值。
该表如下所示:
ID | 姓名 | 来源 | 价值 |
---|---|---|---|
1 | 美国广播公司 | 网络 | 1 |
2 | 美国广播公司 | 打印 | 2 |
3 | 坐标 | 打印 | 8 |
4 | 坐标 | 网络 | 9 |
使用该JSON_OBJECTAGG()
函数,我可以根据名称将源分组在一起:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
这正确给出了:
姓名 | 数据 |
---|---|
美国广播公司 | {"网页":1, "打印":2} |
坐标 | {"打印":8, "网页":9} |
现在,我想运行该查询,但使用价格/来源的过滤器,因此我运行了以下查询:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(data, 2, '$.print')
这似乎有效,但是有一个小问题:
姓名 | 数据 |
---|---|
美国广播公司 | {"网页":1, "打印":2}} |
}
为什么JSON 数据的末尾突然多了一个多余的内容?该HAVING
子句正确地筛选了行,但为什么它会修改结果数据?
在线演示:https ://sqlfiddle.com/mariadb/online-compiler?id=ccf1041c-3ada-4fc9-bd77-2b0fe1428392
我不确定该网站使用哪个版本的 MariaDB,但在我的本地计算机上使用 MariaDB 10.11.9 进行测试得出相同的结果。
编辑:看来我可以通过以下方法解决这个问题:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(JSON_OBJECTAGG(source, value), 2, '$.print')
我只是想避免JSON_OBJECTAGG()
多次写入。此外,虽然这解决了问题,但我仍然很好奇为什么这首先是一个问题。
编辑 2:另一个“修复”是用JSON_OBJECTAGG()
替换GROUP_CONCAT()
。
以下返回正确的数据:
SELECT name,
REPLACE(GROUP_CONCAT(JSON_OBJECT(source, value)), '},{', ',') AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(data, 2, '$.print')