联接后过滤SQL查询,同时从联接表中排除行

时间:2019-12-18 06:03:28

标签: sql postgresql

我有一个包含3个联接的查询,我试图使用最后一个表中的ID来获取最初选择的表中的行数。查询如下:

SELECT COUNT(*)
FROM event
INNER JOIN user ON event.user_id = user.id
INNER JOIN membership ON membership.user_id = user.id
INNER JOIN team ON team.id = membership.team_id
WHERE event_type = 'S' 
AND team.id = 1;

因此,目标是使用team.id获得事件计数,并且仅包括该特定team.id的计数。我面临的问题是,user可以随时间推移在多个团队中,当前此查询返回的是通过成员关系与用户相关的所有团队的事件行的计数。例如,如果用户首先在team.id = 1的团队中,然后在team.id = 2的另一个团队中,并且为每个团队创建了5个事件行,则上述查询当前返回结果为10,而不是5

也许我没有正确考虑这个问题,但是有没有一种方法可以过滤查询,因此仅返回与team.id = 1相关联的行数?

谢谢!

2 个答案:

答案 0 :(得分:0)

您只需要先过滤,然后加入-

SELECT COUNT(*)
FROM event
INNER JOIN user ON event.user_id = user.id
INNER JOIN (SELECT DISTINCT user_id, team_id
            FROM membership
            WHERE team_id = 1) M ON M.user_id = user.id
INNER JOIN team ON team.id = M.team_id
WHERE event_type = 'S'
AND team.id = 1;

答案 1 :(得分:0)

我认为您想统计不同的用户。那应该是:

SELECT COUNT(DISTINCT u.id)
FROM event e JOIN
     user u
     ON e.user_id = u.id JOIN
     membership m
     ON m.user_id = u.id JOIN
     team t
     ON t.id = m.team_id
WHERE event_type = 'S' AND t.id = 1;