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 BY
或 DISTINCT
关键字),然后执行对 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)或任何其他等效项。这与您所做的非常相似。
我正在尝试编写一个 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 BY
或 DISTINCT
关键字),然后执行对 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)或任何其他等效项。这与您所做的非常相似。