0

私は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}

各tagIDについて、num_subscribersは、u_statusが「active」であり、userIDと前述のtagIDがテーブルsubscribeに存在するテーブルuserの下のユーザーの数です。

各tagIDについて、num_itemsは、i_statusが「アクティブ」であり、itemIDと前述のtagIDがテーブルitem_tagに存在するテーブルアイテムの下のユーザーの数です。

また、すべてのtagIDを結果に表示したいと思います。サブスクライブしているユーザーまたはそのtagIDに関連付けられているアイテムがない場合、レコードは次のようになります。

{tagID,tagDetails,0,0}

この結果を生成する(可能な限り「人間が読める」)1つのネストされたクエリは何ですか?

4

1 に答える 1

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)

ブラケットとエイリアシングをいじる必要があるかもしれません。

于 2012-10-01T08:10:12.953 に答える