我有两张特别的桌子。 users
和tags
。 users
表具有tags
类json
列,其存储id到tags
表的映射的引用。例如:
users
.id // Int
.tags // JSON array. Eg [1, 5, 9, 22, 64]
tags
.id // Int
.tag_name // String
我想获取给定用户ID的所有标签。以下伪postgres查询的东西:
select u.id,
u.first_name,
u.last_name,
array(select pt.tag_name from profile_tags pt where pt.id in (u.tags)) as p_tags
from users u
where u.id=$1
显然这不起作用,但我很乐意帮助实现这一目标。
答案 0 :(得分:2)
您需要通过取消数组来规范化JSON,然后您可以加入并聚合:
select u.id,
u.first_name,
u.last_name,
array_agg(t.tag_name)
from users u
cross join lateral json_array_elements(u.tags) as ut(id)
join tags t on t.id = ut.id::int
group by u.id, u.first_name, u.last_name;
如果你这么做很多,将标签引用存储在一个正确规范化的模型中很可能会更有效率。即使将标签ID存储在整数数组列中也会更容易,更有效。