首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出MySQL JSON字段的所有数组元素

列出MySQL JSON字段的所有数组元素
EN

Stack Overflow用户
提问于 2017-08-14 02:46:05
回答 1查看 3.5K关注 0票数 3

我有一个JSON字段来保存post的标签。

代码语言:javascript
复制
id:1, content:'...', tags: ["tag_1", "tag_2"]

id:2, content:'...', tags: ["tag_3", "tag_2"]

id:3, content:'...', tags: ["tag_1", "tag_2"]

我只想列出所有标签及其受欢迎程度(甚至没有它们),如下所示:

tag_2: 3,

tag_1: 2,

tag_3: 1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-14 03:14:12

下面是设置:

代码语言:javascript
复制
create table t ( id serial primary key, content json);
insert into t set content = '{"tags": ["tag_1", "tag_2"]}';
insert into t set content = '{"tags": ["tag_3", "tag_2"]}';
insert into t set content = '{"tags": ["tag_1", "tag_2"]}';

如果您知道任何标记数组中标记的最大数量,则可以使用UNION提取所有标记:

代码语言:javascript
复制
select id, json_extract(content, '$.tags[0]') AS tag from t 
union
select id, json_extract(content, '$.tags[1]') from t;

+----+---------+
| id | tag     |
+----+---------+
|  1 | "tag_1" |
|  2 | "tag_3" |
|  3 | "tag_1" |
|  1 | "tag_2" |
|  2 | "tag_2" |
|  3 | "tag_2" |
+----+---------+

您需要的联合子查询数量与最长数组中的标签数量一样多。

然后,您可以将其放入派生表中,并对其执行聚合:

代码语言:javascript
复制
select tag, count(*) as count
from ( 
    select id, json_extract(content, '$.tags[0]') as tag from t 
    union 
    select id, json_extract(content, '$.tags[1]') from t
) as t2
group by tag
order by count desc;

+---------+-------+
| tag     | count |
+---------+-------+
| "tag_2" |     3 |
| "tag_1" |     2 |
| "tag_3" |     1 |
+---------+-------+

如果将标记存储在第二个表中而不是JSON数组中,这会更容易:

代码语言:javascript
复制
create table tags ( id bigint unsigned, tag varchar(20) not null, primary key (id, tag));
insert into tags set id = 1, tag = 'tag_1';
insert into tags set id = 1, tag = 'tag_2';
insert into tags set id = 2, tag = 'tag_3';
insert into tags set id = 2, tag = 'tag_2';
insert into tags set id = 3, tag = 'tag_1';
insert into tags set id = 3, tag = 'tag_2';

select tag, count(*) as count 
from tags
group by tag
order by count desc;

+-------+-------+
| tag   | count |
+-------+-------+
| tag_2 |     3 |
| tag_1 |     2 |
| tag_3 |     1 |
+-------+-------+

无论每个id有多少个标签,这个解决方案都有效。你不需要知道每个id的标签列表的最大长度。

当您需要存储半结构化数据的“文档”时,JSON很好用,但只有当您将文档视为一个不可缩减的数据值时,JSON才是不错的选择。一旦需要访问文档的元素并对其应用关系操作,面向文档的方法就会显示出它的弱点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45663750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档