在数据库中,我想按用户分组,并且使用三个表:“用户”,“类别”和“文章”。
DECLARE @v INT
SELECT @v = COUNT(*)
FROM Categories
SELECT U.Username
FROM Users AS U
JOIN Articles as A ON U.UserID = A.AuthorID
JOIN Categories as C ON C.CategoryID = A.CategoryID
GROUP BY U.UserID, U.Username
HAVING (SELECT COUNT(DISTINCT CategoryID) FROM Categories) = @v
我要选择的仅是已发布每个类别中的文章的用户。
我存储变量@v中存在的类别数量,并使用HAVING定义条件(也就是说,仅发布了具有尽可能多不同类别的文章的用户),但似乎不起作用因为它将选择所有发表文章的用户,而不管其类别是什么。
我尝试将条件置于WHERE而不是使用HAVING(我仍然不确定两者之间的差异),但是得到的结果是相同的。我也尝试计算表Articles而不是表Categories中不同的CategoryID,但是仍然得到相同的结果。
我想念什么?
表用户数据:
userid | username ----------+----------- 1 | Joe 2 | Sally 3 | Anne
表格文章数据:
articleid | authorID | categoryid ----------+----------+------------- 1 | 3 | 3 2 | 2 | 1 3 | 1 | 2 4 | 3 | 1 5 | 3 | 2
表格类别数据:
categoryid| categoryname ----------+-------------- 1 | sports 2 | events 3 | news
如您所见,共有三(3)个类别,五(5)个文章和三(3)个作者(用户)。他们三个人都写过文章,但只有UserID为3的用户在每个类别中都写过文章。
我的输出:
| username ------------ 1 | Anne 2 | Joe 3 | Sally
预期输出:
| username ------------ 1 | Anne
答案 0 :(得分:1)
我怀疑问题出在HAVING
子句中,可以在COUNT(*)
子句中使用COUNT(DISTINCT CategoryID)
或HAVING
,其余的将是相同的:
SELECT U.Username
FROM Users AS U JOIN
Articles as A
ON U.UserID = A.AuthorID JOIN
Categories as C
ON C.CategoryID = A.CategoryID
GROUP BY U.Username
HAVING COUNT(*) = @v;
但是,Categories
中不需要JOIN
表。如果一个用户发布了重复的类别文章,则使用COUNT(DISTINCT CategoryID)
代替COUNT(*)
。