联接后筛选SQL查询,同时从联接表中排除行

联接后筛选SQL查询,同时从联接表中排除行,sql,postgresql,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'

我有一个包含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
的计数。我面临的问题是,
用户
可以随时间在多个团队中,当前此查询通过成员关系返回与该用户相关的所有团队的事件行计数。例如,如果用户首先在
team.id
=1的团队中,然后在另一个
team.id
=2的团队中,并且为每个团队创建了5个事件行,则上述查询当前将结果返回为
10
,而不是
5

也许我的想法不正确,但是是否有办法过滤查询,以便只返回与
team.id
=1关联的行数


谢谢

您只需先筛选,然后加入-

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;

我想你应该统计不同的用户。这将是:

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;

您的团队和事件表之间应该有关系。用户可能有不同的团队。看来
team.id=1
条件应该可以解决这个问题。你能用一些样本数据来演示吗?@spheres。我删除了不一致的数据库标记。请仅使用您真正使用的数据库进行标记。我已将其更新为postgreql。希望有帮助!谢谢您的快速回复,但不幸的是,我得到了与原始查询相同的结果。@spheres,请您现在再试一次好吗?如果这也不能解决您的问题,请提供示例数据。谢谢。我的目标实际上是统计所有不同的事件,而不是统计用户。我尝试将上述内容修改为:
SELECT COUNT(DISTINCT e.id)FROM event e JOIN user u ON e.user\u id=u.id JOIN membership m ON m.user\u id=u.id JOIN team t ON t.id=m.team\u id,其中event\u type='S'和t.id=1但这会得到两个团队(id=1和id=2)合计的相同计数结果