我有两个表:
CREATE TABLE posts (
post_id int, tags int[]
);
INSERT INTO posts (post_id, tags) VALUES
(1, '{1, 2, 3}'), (2, '{3, 2, 4, 5, 7}'),
(3, '{6}'), (4, '{1, 7}'),
(5, '{4, 5, 3}'), (6, '{1, 4, 5}'),
(7, '{5, 6, 7}'), (8, '{7, 8}'),
(9, '{4}'), (0, '{3, 7, 8}');
CREATE TABLE tags (
tag_id int, name varchar
);
INSERT INTO tags (tag_id, name) VALUES
(1, 'HTML'), (2, 'SQL'), (3, 'JS'),
(4, 'C++'), (5, 'Golang'), (6, 'CSS'),
(7, 'Java'), (8, 'Lua');
我需要按引用数量获取前5个(名称,数字)标签。
我熟悉循环,并且可以遍历数组。但是在这种情况下,对于我来说如何将每个数组和整个表的迭代组合在一起并不清楚。
执行此任务的方式是什么?
答案 0 :(得分:1)
您可以使用unnest()
将数组转换为行。剩下的就是join
和聚合:
select t.name, count(*)
from posts p cross join
unnest(tags) tag join
tags t
on t.tag_id = tag
group by t.name
order by count(*) desc
fetch first 5 rows only;
Here是db <>小提琴。