2016-12-19 3 views
-1

私はクエリの能力を向上させようとしていますが、中程度の複雑さの結合については頭を悩ましています。可能な限り明確かつ簡潔にするために、私は3つのテーブルに参加しようとしています。最初の参加、私は3番目の表を参照したい。この後users.User_ID = posts.FK_User_ID3つのテーブルを結合してそのうちの1つにカウントを使用

**User table** 
User_ID pk 
username int 
email 
etc... 

**Post Table** 
post_ID PK 
User_ID FK 
Post 
etc... 

**Like Table** 
FK_User_ID references user.user_ID 
FK_Post_ID references post.Post_ID (*This is what I want to count*) 

上のすべてのユーザーからの投稿を選択します。この表には、ユーザー表のuser_IDへの外部キーと、ポスト表の主キーPost_IDを参照するFK_Post_IDの外部キーが含まれています。この3番目の表は、投稿を好きなユーザーのリンクテーブルです。私は、この表にポストIDのすべてのオカレンスをカウントし、初期ユーザーに各ポストに追加し、ポストに参加したいので、出力結果は次のようになります。

User_id Username Post_ID Post  Number_of_Likes 
    1   bob  4  'foo'  18 

私の最初の2つのテーブル間の結合を作品そして今、私はポストのIDのようなテーブルに表示された回数の合計#をカウントし、各列に付加する第三のテーブルを参照する方法が必要

select * from users 
    join post 
    on post.User_ID=users.User_ID 

(例えば*と簡体字)、このようになります。 。これは私が失われた場所です、私は運がないことをたくさん試しています。私は2回目のジョインのために内部ジョイン句を構築する必要があると考えているか、ネストされたselectステートメントを取り除く必要がありますか?私が間違っている場合、誰かが私にこれを修正して、おそらく正しい方向に私を導くことができますか?感謝します!

+0

使用するdbmsにタグを付けることができますか? –

+0

あなたは、結合の前に3番目のテーブルからカウントを得るためにサブクエリするか、3つのテーブルから 'count(Distinct Primary.keyField)'を使うか、またはウィンドウ関数 'count()over(論理キー) 'DBMS&Versionは、サブクエリがすべてのRDBMSで機能しますが、どのオプションが利用できるかを定義するのに役立ちます。 – xQbert

+0

予想される出力に加えて、テーブル定義といくつかのサンプルデータの投稿を検討してください。 – mustaccio

答えて

1

これを行う一般的な方法は、カウントとキーを持ちサブスクリプションを作成するサブクエリを作成することです。このように:

select * 
from users 
join post on post.FK_User_ID=users.User_ID 
left join (
    select FK_Post_ID, count(*) as count_of_likes_on_a_post 
    from likestable 
    group by FK_Post_ID 
) likes on post.Post_ID = likes.FK_Post_ID 
関連する問題