我有三个表:
Table USER id name email
Table CAMPUS id user_id (foreign key) name
Table POST id title user_id (foreign key)
用户属于园区,帖子属于用户。我想编写一个查询以获取用户内部联接与校园内部联接的帖子。
我得到的结果:
[{ id username campus name title ... }]
一切都在一个对象中。相反,我想要这样的嵌套对象:
[{ post_title: post_id: ... User: {id name... } campus:{id name ...} }]
这样,User和Campus会根据外键在帖子中继承。 如何使用原始SQL实现它?我应该稍后再解析吗?
答案 0 :(得分:1)
您可以使用join和json函数来生成所需的结果。
您关于表结构的问题不是很准确,但这应该像这样:
select
json_object(
'id', p.id
'title', p.title
'user', json_object('id', u.id, 'name', u.name),
'campus', json_object('id', c.id, 'name', c.name)
) post_object
from posts p
inner join users u on u.id = p.user_id
inner join campus c on c.user_id = u.id
这为您提供了一个结果集,该结果集具有一个列和每个帖子一个记录,作为json对象,其中包含代表用户和园区的嵌套对象。
如果您希望结果包含一行并且所有行都填充在json数组中,则可以在此顶部使用json_arrayagg()
:
select json_arrayagg(
json_object(
'id', p.id
'title', p.title
'user', json_object('id', u.id, 'name', u.name),
'campus', json_object('id', c.id, 'name', c.name)
)
) all_posts_objects
from posts p
inner join users u on u.id = p.user_id
inner join campus c on c.user_id = u.id