Sql 结合计数的内部联接
在我们的数据库中,我们有机组人员和非机组人员。每个船员和非船员都可以有朋友 例如,一名船员与4名船员和2名非船员成为朋友 我想知道的是非机组人员的平均数量,我们的机组人员的AirlineCode=LH 我们有两张桌子: AppUser:存储用户数据的位置 这是细胞 AppUser.IsCrew(0=非船员,1=船员) AppUser.AirlineCode(某种类型的sting) 追随者:朋友列表存储 Follower.FromUserId 杜塞里德 在那里,我们存储AppUser.Id=1有5个朋友,并跟随Follower.ToUserId 3、4、5,依此类推 问题是,我甚至不知道如何开始: 查询哪些检查 a) 所有AppUser.IsCrew=1,且具有Airline.Code=LH b) 在Follower表中检查他们跟踪了多少用户,但只有AppUser.IsCrew中的ToUserId=0 然后返回一个平均数Sql 结合计数的内部联接,sql,sql-server,Sql,Sql Server,在我们的数据库中,我们有机组人员和非机组人员。每个船员和非船员都可以有朋友 例如,一名船员与4名船员和2名非船员成为朋友 我想知道的是非机组人员的平均数量,我们的机组人员的AirlineCode=LH 我们有两张桌子: AppUser:存储用户数据的位置 这是细胞 AppUser.IsCrew(0=非船员,1=船员) AppUser.AirlineCode(某种类型的sting) 追随者:朋友列表存储 Follower.FromUserId 杜塞里德 在那里,我们存储AppUser.Id=1有5
非常感谢您的帮助首先,您需要计算每个机组人员有多少非机组人员朋友。确保你也计算所有船员,即使他们没有朋友 然后是平均这些计数的问题。查询应该如下所示:
with x as (
select
c.id, count(n.id) as nc_total
from AppUser c
left join Follower f on f.FromUserId = c.id
left join AppUser n on f.ToUserId = n.id and n.isCrew = 0
where c.isCrew = 1
and c.AirLineCode = 'LH'
group by c.id
)
select avg(nc_total) from x
具体的数据库引擎是什么?Oracle、PostgreSQL、DB2等。我们使用的是microsoft sql Server。表的设计非常不清楚,您能澄清一下并在问题中添加一些示例数据吗?非常感谢,这正是我需要的。一个问题:如果不考虑平均值,在表AppUser中我还有一个单元格“LastActivityDate”。如何从上述查询结果中“取消选择”所有活动日期晚于x的用户?@Andreas AppUser使用了两次。如果要为crewmember AppUser(
c
)添加额外的“过滤条件”,请将其添加到WHERE
部分。可能类似于和c.LastActivityDate
。但是,如果要将筛选条件添加到非乘员(n
),请将其附加到该特定联接的ON
子句中。