2012-04-18 4 views
0

私は次のテーブルを持っています:ネストされた結合内の2つの異なる表の行の合計。 SQL Server

ユーザー、ビート、フロー、Beat_Likes_Dislikes、Flow_Likes_Dislikes。ここに関係があります。

ユーザUserIDは、ビートとFLOWのUserID外部キーの両方と関係があるプライマリキーです。ビートBeatIDはBeats_Likes_Dislikes BeatIDとの関係を持っています。それは流れとそのようなものと同じです。私は嫌いなものとして、ビートとフローの好き嫌いと好き嫌いの両方の表を組み合わせる必要があります。私は以下を持っています:

SELECT 
ISNULL(SUM(Beats_Likes_Dislikes.[Like]) , 0) AS Likes, 
-- + ISNULL(SUM(Flows_Likes_Dislikes.[Like]), 0) AS Likes, 
ISNULL(SUM(Beats_Likes_Dislikes.Dislike), 0) AS DisLikes 
-- + ISNULL(SUM(Flows_Likes_Dislikes.DisLike), 0) AS DisLikes 
From Users 
INNER JOIN Beats 
ON Users.UserID = Beats.UserID 
INNER JOIN Beats_Likes_Dislikes ON Beats.BeatID= Beats_Likes_Dislikes.BeatID 
--INNER JOIN Flows ON Users.UserID = Flows.UserID 
--INNER JOIN Flows_Likes_Dislikes ON Flows.FlowID=Flows_Likes_Dislikes.FlowID 
Where Users.UserID = '110' 

これは、拍のための好き嫌い(別々の行)の合計を返すだけで素晴らしい作品です。私はフローテーブルから同じデータを取得する必要があります。数字が足りないので、私はフローテーブルの部分をコメントアウトしています。私はここで間違って何をしていますか?

ありがとうございました。

答えて

0

は、この試してみて:

SELECT SUM(likes) as totalLikes, 
     SUM(dislikes) as totalDislikes 
    FROM (SELECT Isnull(SUM(beats_likes_dislikes.[Like]), 0) AS likes, 
       Isnull(SUM(beats_likes_dislikes.dislike), 0) AS dislikes 
      FROM users 
     INNER JOIN beats 
       ON users.userid = beats.userid 
     INNER JOIN beats_likes_dislikes 
       ON beats.beatid = beats_likes_dislikes.beatid 
     WHERE users.userid = '110' 

     UNION ALL 

     SELECT Isnull(SUM(flows_likes_dislikes.[Like]), 0) AS likes, 
       Isnull(SUM(flows_likes_dislikes.dislike), 0) AS dislikes 
      FROM users 
     INNER JOIN flows 
       ON users.userid = flows.userid 
     INNER JOIN flows_likes_dislikes 
       ON flows.flowid = flows_likes_dislikes.flowid 
     WHERE users.userid = '110') AS t 

それはあなたのユーザーのための総好き嫌いを与える必要があります。

+0

に参加することをお勧めします。ありがとうございます。 – nawlrus

0

厳密な要件に応じて、おそらく内側結合とは対照的に、LEFT OUTER JOINを使用する必要があります。 Info on Join Types ...あなたの番号がオフになっている理由。

1

誤って多対多のジョインをしているため、番号が間違っている可能性があります。例えば、すべてのユニークユーザーは複数のビートを持つことができ、ユニークなビートごとに複数の好き嫌いを持つことができます。 OKですが、別のテーブルセットに水平に結合しようとすると、ON条件が各ユーザー/フロー/フローティングペアに対して2回以上真であるため、あまりにも多くの行が作成されます。これを修正するには

、あなたは2つのクエリに分離して、これが働いた結果

select 
coalesce(beat_likes,0)+coalesce(flow_likes,0) as total_likes, 
coalesce(beat_dislikes,0)+coalesce(flow_dislikes,0) as total_dislikes 
FROM 
( 
SELECT 
u.UserID, 
SUM(bld.Like) as beat_likes, 
SUM(bld.Dislike) as beat_dislikes 
From Users u 
    INNER JOIN Beats b 
    ON u.UserID = b.UserID 
     INNER JOIN Beats_Likes_Dislikes bld 
     ON b.BeatID= bld.BeatID 
Where u.UserID = '110' 
GROUP BY u.UserID 
) t1 
JOIN 
(
SELECT 
u.UserID, 
SUM(fld.Like) as flow_likes, 
SUM(fld.Dislike) as flow_dislikes 
From Users u 
    INNER JOIN Flows f 
    ON u.UserID = f.UserID 
     INNER JOIN Flows_Likes_Dislikes fld 
     ON f.FlowID= fld.FlowID 
Where u.UserID = '110' 
GROUP BY u.UserID 
) t2 
on t1.UserID =t2.UserID 
+0

投稿する前にSteve Stedmanを実装しました。説明のためのThans。 +1 – nawlrus

関連する問題