说我有这两个表:
id | user_id | title | slug | content | views
----+---------+-------+------+---------+-------
id | username | email | hash | role | auth
----+----------+-------+------+------+------
使用这两个表我想做SELECT * FROM posts ...
查询并最终以这样的方式回复:
{[
{
"id": "1",
"user_id": "2",
"title": "Foo",
"slug": "foo",
"content": "bar",
"views": "0",
"user": {
"id": "2",
"username": "john",
"email": "john@smith.com",
"hash": "aeigh*£HAEGhoiaehg",
"role": "admin",
"auth": "aeg89hiae9g8hA*H£GA(*EHG"
}
}
]}
我对SQL很新,这样的模式在使用ORM时似乎很常见,所以我想知道我必须采取哪些步骤才能使用原始SQL获得这样的结果。
有什么想法吗?
答案 0 :(得分:2)
在postgresql 9.2或更高版本中,您可以使用row_to_json
函数:
select row_to_json(posts)
from
posts....;
您的查询可能如下所示:
select row_to_json(row)
from (
select p.*, urd AS user
from posts p
inner join (
select ur.*
from users ur
) urd(id,username,email,hash,role,auth) on urd.id = p.user_id
) row;
这个直接的sql不需要这么复杂:
select
p.*, u.*
from
posts p
inner join users u on p.user_id = u.id
答案 1 :(得分:2)
要获得您要求的内容,请在嵌套子查询中使用row_to_json()
,并可选择在外部调用中添加第二个参数TRUE
以进行漂亮打印:
SELECT row_to_json(combi, true) AS pretty_json
FROM (
SELECT p.*, u AS user
FROM posts p
JOIN users u ON u.id = p.user_id
WHERE p.id = 1
) combi;
您只需要一个子查询级别。
关于漂亮格式(仅与文字表示相关) - per documentation:
如果pretty_bool为true,则会在第1级元素之间添加换行符。
SQL Fiddle(投射到文本(::text
)进行显示;换行符不显示在SQL Fiddle中)。
答案 2 :(得分:0)
或者,您可以使用薄的中间层 - restSQL。它是一个开源的,超轻量级的持久层,对PostgreSQL提供开箱即用的支持。它用9.3测试,但9.2可能不是问题。
您可以使用泊坞窗图片在大约10分钟内部署。