Postgresql 如何合并两个不同的查询
假设我在PostgreSQL中有这两个表Postgresql 如何合并两个不同的查询,postgresql,Postgresql,假设我在PostgreSQL中有这两个表 TABLE "Likes" ( id, post-id (foreign key pointing to "Post" table) ) TABLE "Post" ( id, body, date ) 我想做的是获取所有帖子和每个帖子的喜欢次数 我写了这个查询: SELECT "post-id", COUNT(*) AS "likes" FROM "Likes" GROUP BY "post-id"; 它将返
TABLE "Likes" (
id,
post-id (foreign key pointing to "Post" table)
)
TABLE "Post" (
id,
body,
date
)
我想做的是获取所有帖子和每个帖子的喜欢次数
我写了这个查询:
SELECT "post-id", COUNT(*) AS "likes" FROM "Likes"
GROUP BY "post-id";
它将返回如下内容:
-------------------
| post-id | likes |
-------------------
| 1 | 9 |
-------------------
| 4 | 2 |
-------------------
---------------------------------------------------
| id | likes | body | date |
---------------------------------------------------
| 1 | 9 | This is a post! | 2017-05-03 |
---------------------------------------------------
| 2 | | Tasdasdas! | 2017-05-03 |
---------------------------------------------------
| 4 | 2 | This is another post! | 2017-05-04 |
---------------------------------------------------
| 5 | | ssdasdasdadadass | 2017-05-04 |
---------------------------------------------------
但我仍然需要将此查询与获取有关帖子的所有信息的查询合并。。。所以最后,我想要这样的东西:
-------------------
| post-id | likes |
-------------------
| 1 | 9 |
-------------------
| 4 | 2 |
-------------------
---------------------------------------------------
| id | likes | body | date |
---------------------------------------------------
| 1 | 9 | This is a post! | 2017-05-03 |
---------------------------------------------------
| 2 | | Tasdasdas! | 2017-05-03 |
---------------------------------------------------
| 4 | 2 | This is another post! | 2017-05-04 |
---------------------------------------------------
| 5 | | ssdasdasdadadass | 2017-05-04 |
---------------------------------------------------
我的问题是,我不知道如何将“likes”列添加到获取所有帖子的查询中,因为只有一些帖子有likes
提前谢谢^_^ 您想要的是
左连接的典型情况:
SELECT post.*, COUNT(likes.id) likes
FROM post
LEFT JOIN likes ON post.id = likes.post_id
GROUP BY post.id
这样,您就可以选择post.*
,因为groupbypost.id
意味着
旁注:您的标识符的命名非常奇怪。您应该尽量避免引用标识符,这只会使您的查询更难阅读。您想要的是左连接的典型情况:
SELECT post.*, COUNT(likes.id) likes
FROM post
LEFT JOIN likes ON post.id = likes.post_id
GROUP BY post.id
Select p.id, c."likes", p.body, p.date
from Posts p
left join
(
SELECT "post-id", COUNT(*) AS "likes" FROM "Likes"
GROUP BY "post-id"
) c on p.id = c."post-id";
这样,您就可以选择post.*
,因为groupbypost.id
意味着
旁注:您的标识符的命名非常奇怪。您应该尽量避免引用标识符,这只会使您的查询更难阅读。谢谢,它奏效了!:另外,我通常不使用引号,但出于某种原因,我不得不使用引号,否则它将不起作用。我使用phpPgAdmin来管理数据库和测试查询,如果标识符不都在引号内,它会给出错误。@Tirafesi我不是说你不需要引号。当你有这样的标识符时,你真的需要它。我是说,你不应该在一开始就使用这样的标识符。或者,至少,没有它们,你的工作会更简单。但如果你能忍受,就用它们。我不明白你的意思。。。你能给我举个正确标识符的例子吗?@Tirafesi喜欢答案中的那些。即所有小写字母,以字母(而不是数字)开头&使用下划线分隔单词(如果您需要分隔符)。——大写字母和-
使您使用quote.Aah。那么实际的表名是怎么回事?与其创建名为Post的表,不如将其命名为Post?谢谢,它成功了!:另外,我通常不使用引号,但出于某种原因,我不得不使用引号,否则它将不起作用。我使用phpPgAdmin来管理数据库和测试查询,如果标识符不都在引号内,它会给出错误。@Tirafesi我不是说你不需要引号。当你有这样的标识符时,你真的需要它。我是说,你不应该在一开始就使用这样的标识符。或者,至少,没有它们,你的工作会更简单。但如果你能忍受,就用它们。我不明白你的意思。。。你能给我举个正确标识符的例子吗?@Tirafesi喜欢答案中的那些。即所有小写字母,以字母(而不是数字)开头&使用下划线分隔单词(如果您需要分隔符)。——大写字母和-
使您使用quote.Aah。那么实际的表名是怎么回事?不是创建名为Post的表,而是应该将其命名为Post?
Select p.id, c."likes", p.body, p.date
from Posts p
left join
(
SELECT "post-id", COUNT(*) AS "likes" FROM "Likes"
GROUP BY "post-id"
) c on p.id = c."post-id";