2017-05-04 11 views
0

私はこれらの2つのテーブルをPostgreSQLに持っています。2つの異なるクエリをマージする方法

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  | 
------------------- 

をしかし、私はまだ投稿に関するすべての情報を取り出す1でこのクエリをマージする必要があります。 ..最後に、私はこのようなものが欲しい:

--------------------------------------------------- 
| 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」列を追加する方法。

ありがとうございます!^_^

答えて

2

何が欲しいのはLEFT JOINのための典型的なケースである:

SELECT post.*, COUNT(likes.id) likes 
FROM  post 
LEFT JOIN likes ON post.id = likes.post_id 
GROUP BY post.id 

この方法では、することができますSELECT post.*ためGROUP BY post.idfunctional dependencyを意味します。

Sidenote:あなたの識別子の名前は本当に奇妙です。識別子を引用符で囲む必要性を避けようとすると、クエリを読みにくくするだけです。

+0

ありがとうございました! :Dまた、私は通常引用符を使用しませんが、何らかの理由で私は強制されます、そうでなければ動作しません。私はデータベースを管理し、クエリをテストするためにphpPgAdminを使用しています。識別子がすべて引用符で囲まれていないとエラーになります。 – Tirafesi

+0

@Tirafesi私はあなたが引用を必要としないと言っているわけではありません。あなたはそれが本当に必要なときにそれを必要とします。私はあなたが最初にそのような識別子を使用すべきではないと言っています。または、少なくとも、あなたの仕事はそれらなしでより簡単になります。しかし、あなたがそれで生きることができれば、それらを使用してください。 – pozs

+0

あなたは何を意味するのか分かりません...正しい識別子の例を教えてください。 – Tirafesi

1
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"; 
関連する問題