SQL 生成以下输出的查询?

SQL query that produces the following output?

我正在尝试编写一个 SQL 语句来生成以下输出。
我有以下两个表格:

用户电影

userID | movieID
-----------------
  135  |  k0jps
  135  |  p1zka
  125  |  v0t67
  115  |  opp2s
  111  |  xnwri
  115  |  kspdl

关注

followerid | followingid
------------------------
    122    |     135  
    192    |     111
    125    |     240
    120    |     125
    45     |     111

我想获取 UserMovie Table 中每个用户的关注者数量,结果如下:

结果

userid | followerCount
----------------------
  135  |       1
  125  |       1
  115  |       0
  111  |       2

下面的语句部分地给出了我想要的:

SELECT followingid, count(*) as followerCount   
FROM Follows   
WHERE followingid in (SELECT DISTINCT userID FROM UserMovie)   
GROUP BY followingid  

上述查询的问题是拥有 0 个关注者的用户不会出现在给出以下输出的结果中:

userid | followerCount
----------------------
  135  |       1
  125  |       1
  111  |       2

知道怎么做吗?

这是一种方法:在内联视图中从 UserMovie 中获取 userID 的不同列表(使用 GROUP BYDISTINCT 关键字),然后执行对 Followers table 的 "outer join" 操作以查找关注者。使用 GROUP BY 折叠行,并使用聚合函数从 Followers table 中获取 userId 的 unique/distinct 个非空值的计数.

例如:

SELECT u.userID
     , COUNT(DISTINCT f.userID) AS cnt_followers
  FROM ( SELECT m.userID
           FROM UserMovie m
          GROUP BY m.userID
       ) u
  LEFT
  JOIN Follows f
    ON f.followingid = u.userID
 GROUP BY u.userID

编辑

SELECT 列表中存在无效的列引用,f.userID 无效。那应该是 f.followerID.

当我们解决这个问题时,查询 returns:

userID  cnt_followers
111     2
115     0
125     1
135     1

SQL Fiddle HERE http://sqlfiddle.com/#!9/de3e7/2

只要我们计算 "distinct" followerid(问题不保证 (followerID,followingID)Followers table 中是唯一的),我们可以消除内联视图

SELECT u.userID
     , COUNT(DISTINCT f.userID) AS cnt_followers
  FROM UserMovie u
  LEFT
  JOIN Follows f
    ON f.followingid = u.userID
 GROUP BY u.userID

试试这个以包括没有以下内容的用户:

SELECT  UserId, Count(followerid) AS followerCount
FROM (SELECT DISTINCT userId FROM UserMovie ) m
LEFT JOIN Follows f
ON f.followingid = m.userID
GROUP BY UserId

现在生成:

UserId  followerCount
111 2
115 0
125 1
135 1

以下对我有用。 但是,对于没有关注者的用户,我得到的是 NULL 而不是 0

SELECT DISTINCT u.userid, t.followerCount   
FROM UserMovie u  
LEFT JOIN (   
SELECT followingid, count(*) AS followerCount      
FROM Follows      
WHERE followingid in (SELECT DISTINCT userID FROM UserMovie)      
GROUP BY followingid ) as t   
on t.followingid = u.userid

使用 CASE 的解决方案怎么样?

SELECT userId,
CASE
  WHEN IFNULL(followerid, 0) = 0 THEN 0
  ELSE count(*)
END
FROM UserMovie
LEFT JOIN Follows on followingid=userID
GROUP BY userId;

似乎在 SQLite3 中工作正常,只需将 IFNULL 替换为 ISNULL(如果是 SQLServer)或任何其他等效项。这与您所做的非常相似。