2012-10-01 95 views
0

加入我有5個表:MySQL查詢選擇從5桌

tag: {tagID,tagDetails} 
user: {userID,userDetails,u_status=[active or banned]} 
subscribe: {tagID,userID} 
item: {itemID, itemDetails,i_status=[active or banned]} 
item_tag: {tagID,itemID} 

我想選擇這些數據:

result: {tagID, tagDetails, num_subscribers, num_items} 

對於每個標籤識別,NUM_SUBSCRIBERS是用戶的桌子底下數用戶,其u_status爲'active'且其用戶ID和所述標籤ID存在於表中訂閱

對於每個tagID,num_items是i_status爲'active'的表項下的用戶數量,以及其itemID和所述tagID存在於表中item_tag

此外,我希望所有的tagID出現在結果中。如果沒有與該標籤識別關聯的用戶訂閱或項目,該記錄將被

{tagID,tagDetails,0,0} 

是什麼產生這種結果的最好(如「人類可讀」越好)一個嵌套查詢?

+0

它在這五張桌子之間有一個簡單的'JOIN'接縫,爲什麼不試着自己寫呢?之後,您可以詢問是否出現問題。 –

回答

1

這是你所追求的?

 SELECT T.tagID, T.tagDetails, count(distinct U.u_status), count(distinct I.i_status) 
     FROM tag T 
      JOIN subscribe S ON T.tagID = S.tagID 
      JOIN user U ON S.userID = U.userID 
      JOIN item_tag IT ON T.tagID = IT.tagID 
      JOIN item I ON IT.itemID = I.itemID 
     WHERE U.u_status = 'active' and I.i_status = 'active' 
     GROUP BY T.tagID 

     UNION 

     (SELECT tagID, tagDetails, 0, 0 
     FROM tag 
     EXCEPT 
     SELECT T.tagID, T.tagDetails, 0, 0 
     FROM tag T 
      JOIN subscribe S ON T.tagID = S.tagID 
      JOIN user U ON S.userID = U.userID 
      JOIN item_tag IT ON T.tagID = IT.tagID 
      JOIN item I ON IT.itemID = I.itemID 
     WHERE U.u_status = 'active' and I.i_status = 'active' 
     GROUP BY T.tagID) 

您可能不得不剔除括號和別名。

+0

感謝您的回答。我忘了提及我希望所有tagID出現在結果中。如果沒有用戶訂閱或與該tagID關聯的項目,記錄將爲{tagID,tagDetails,0,0} –

+0

請參閱編輯的一種方法 – Dan

+0

這將有count(U.u_status)等於count( I.i_status),但它們並不一定如此。可能有以下情況: 一個標籤有一個訂閱者和該標籤下的兩個項目。 TAGID:1 (TAGID,用戶ID):(1,1) (TAGID,ITEMID):(1,1),(1,2) 該表將是: (TAGID,用戶ID,項ID): (1,1,1),(1,1,2) (tagID,num_subs,num_items):(1,2,2) 我希望(tagID,num_subs,num_items)爲(1,1, 2) –