-2

我在 sql server 中有一个表,其中包含以下字段

firstname,id,affID

affID 是其他用户的 id。

可以说我有这个记录

firstname     id    affID
bob            1     2        
someone        2     3
bob2           3     2 
baaroz         4     3
lastman        5     2

我想做一个查询,向我显示名字、id 和其他用户中此 id 的 affID 计数按此计数排序。

所以最后的输出应该是这样的

firstname  id     count(number of this id in affID of other users)
someone    2            3
bob2       3            2
bob        1            0
baaroz     4            0
lastman    5            0

到目前为止,我做了这个查询,返回每个 id 的 affID 数

SELECT affID, count(affID) FROM Users group by affID

上面提到的输出的正确查询是什么?

4

3 回答 3

1

您应该能够使用子查询来获取计数,然后加入您的表:

select u1.firstname,
  u1.id,
  coalesce(u2.total, 0) total
from users u1
left join
(
  SELECT affID, count(affID) Total
  FROM Users 
  group by affID 
) u2
  on u1.id = u2.affID
order by u2.total desc;

请参阅带有演示的 SQL Fiddle

于 2013-03-05T19:37:25.973 回答
0

您将需要进行自联接以获取每个用户的计数,并使用左外联接将它们映射回所有用户。

此查询为影响其他用户的每个用户提供受影响用户的计数:

SELECT U.id                           -- This is the ID of the user that affected others
     , Count(U2.id) as Cnt            -- This is the Count 
  FROM Users U
  INNER JOIN User U2 
          ON U.AffUserId = U2.id
 GROUP BY U.id

然后您需要进行最后的 LEFT OUTER JOIN,然后将此聚合数据映射到表中的所有用户(即,即使是那些没有影响任何人的用户)

SELECT Usr.firstName
     , Usr.id
     , ISNULL(Ctbls.Cnt, 0) as [Count]
  FROM Users Usr
LEFT OUTER JOIN
   (SELECT U.id, Count(U2.id) as Cnt
      FROM Users U
      INNER JOIN User U2 
              ON U.AffUserId = U2.id
      GROUP BY U.id) CTbls
    ON Usr.id = Ctbls.Id
于 2013-03-05T19:34:46.460 回答
0

我认为您对 baaroz 和 lastman 的 ID 值不应为“1”,而应分别为“4”和“5”。如果这是真的,那么我相信我理解你的问题,你需要做的就是添加

"ORDER BY Count(AffUserId) DESC" 

到您的查询结束。

(由于 Id 和用户名似乎是唯一的,您可以将用户名添加到您的组中。这是多余的,但比使用子查询并将表连接回自身更容易。)

于 2013-03-05T19:37:37.217 回答