2016-12-19 23 views
-1

我試圖提高查詢能力,並且一直困擾着中等複雜度的連接。爲了儘可能簡潔明瞭,我試圖加入3張表格。第一次參加所有用戶選擇的職位上users.User_ID = posts.FK_User_ID加入三張表並使用它們其中之一

**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的外鍵。這第三張表是喜歡這篇文章的用戶的鏈接表。我想算一個帖子ID的所有出現在該表中,並追加到初始用戶和後每個崗位參加這樣的輸出結果是這樣的:

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

我第一次在兩個表之間的連接工程看起來像這樣

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

現在我需要一種方法來引用第三個表來算的時間總#一個post ID出現在如表並追加到每一行(帶*例如簡化) 。這是我迷失的地方,我一直在嘗試很多事情,但沒有運氣。我相信我需要爲我的第二個連接構造一個內部連接子句,或者我需要取消嵌套的select語句?如果我錯了,是否有人可以糾正我這個問題,也許可以直接指導我?欣賞它!

+0

你能標記正在使用的dbms嗎? –

+0

您必須在連接前從子查詢中獲取第三個表的計數,使用3表中的count(Distinct Primary.keyField),或者使用窗口函數count()over邏輯鍵)'DBMS和版本將幫助定義哪些選項可用,儘管子查詢可以在所有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