0

私は次のテーブルを持っています:

ユーザー、ビート、フロー、Beat_Likes_Dislikes、Flow_Likes_Dislikes。これが関係です。

ユーザーUserIDは、BeatsとFLowのUserID外部キーの両方と関係がある主キーです。Beats BeatIDは、Beats_Likes_DislikesBeatIDと関係があります。フローとそのlike_dislikeテーブルについても同じです。ビートとフローの「いいね」を「いいね」として、両方の表の「嫌い」を「嫌い」として合計する必要があります。私は次のものを持っています:

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'

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

ありがとう。

4

3 に答える 3

1

不注意による多対多の結合により、数値がずれている可能性があります。たとえば、すべての一意のユーザーは複数のビートを持つことができ、各一意のビートは複数の好き嫌いを持つことができます。それは問題ありませんが、別のテーブルのセットを水平方向に結合しようとすると、各ユーザー/フロー/フローレーティングのペアに対して ON 条件が複数回真になるため、行が多くなりすぎてしまいます。

これを修正するには、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
于 2012-04-18T03:03:32.553 に答える
0

正確な要件によっては、おそらく INNER JOIN ではなく LEFT OUTER JOIN を使用する必要があります。 結合タイプに関する情報...それがあなたの数字がオフになっている理由です。

于 2012-04-18T02:51:54.503 に答える
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 

ユーザーの好き嫌いの合計を表示する必要があります。

于 2012-04-18T02:59:17.390 に答える