繁体   English   中英

嵌套联接中两个不同表中的行求和。 SQL服务器

[英]SUMing rows in two different tables in a nested join. SQL Server

我有以下表格:

用户,节拍,流程,Beat_Likes_Dislikes,Flow_Likes_Dislikes。 这里是关系。

用户UserID是与Beats和FLow的UserID外键都有关系的主键。 Beats BeatID与Beats_Likes_Dislikes BeatID有关系。 与流程及其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'

返回节拍的喜欢和不喜欢的总和(分开的行),这非常有用。 我需要从流表中获取相同的数据。 您会看到我注释掉了流表的那一部分,因为数字没有加起来。 我在这里做错了什么?

谢谢。

您的电话号码可能由于无意中的多对多连接而关闭。 例如,每个唯一用户可以有多个节拍,每个唯一节拍可以有多个喜欢或不喜欢。 可以,但是如果您随后尝试水平连接另一组表,则最终会创建过多的行,因为对于每个用户/流/流对,ON条件不只一次满足。

为了解决这个问题,您可能需要分为两个查询,然后将结果合并

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

根据您的确切要求,您可能需要使用LEFT OUTER JOIN而不是INNER JOIN。 有关联接类型的信息 ...这就是为什么您的号码不可用的原因。

试试看:

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 

它应该为您提供用户的总体好恶。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM