[英]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.