2012-04-18 1 views
0

У меня есть следующие таблицы:SUMING строки в двух разных таблицах в вложенном соединении. SQL Server

Пользователи, удары, потоки, Beat_Likes_Dislikes, Flow_Likes_Dislikes. Вот отношения.

Пользователи UserID - это первичный ключ, который имеет отношение как к внешнему ключу пользователя, так и к биту пользователя FLOW. Beats BeatID имеет отношения с Beats_Likes_Dislikes BeatID. То же самое происходит с потоками и таблицей подобного типа. Мне нужно суммировать Likes in Beats and Flows как Likes и Dislikes в обеих таблицах как «Не нравится». У меня есть следующий:

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

В зависимости от ваших конкретных требований, вероятно, вам необходимо использовать ЛЕВУЮ ВНУТРЕННУЮ РАБОТУ, а не ИНТЕРНЕТ-ВСТУПЛЕНИЕ. Info on Join Types ... Вот почему ваши номера отключены.

1

Ваши номера могут быть отключены из-за непреднамеренного объединения многих-ко-многим. Например, каждый уникальный пользователь может иметь несколько ударов, и каждый уникальный ритм может иметь несколько симпатий или антипатий. Это нормально, но если вы затем попытаетесь горизонтально присоединиться к другому набору таблиц, вы завершите создание слишком большого количества строк, так как условие ON истинно более одного раза для каждой пары user/flow/flowrating.

Чтобы исправить это, вы можете разделить на 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

Я реализовал Стив Stedman перед тем, как вы разместили это. Thans для объяснения. +1 – nawlrus

Смежные вопросы