如何 select 仅具有一定价值的用户?

How to select only users with certain value?

在我的数据库中,我想按用户分组,我使用了三个 table:用户、类别和文章。

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

我想要的select只是在现有的每个类别中发表过文章的用户。

我在变量@v中存储了分类的个数,并用HAVING定义了条件(即只有发表过文章的用户与存在的分类一样多),但是好像没有工作,因为它将 select 所有发表过文章的用户,无论类别如何。

我尝试将条件设置为 WHERE 而不是使用 HAVING(我仍然不确定两者之间的区别),但我得到了相同的结果。我也尝试从 table 文章而不是 table 类别中计算不同的类别 ID,但仍然得到相同的结果。

我错过了什么?

Table 用户数据:

  userid  | username
----------+-----------
        1 | Joe  
        2 | Sally
        3 | Anne 

Table文章数据:

articleid | authorID | categoryid
----------+----------+-------------
        1 | 3        | 3
        2 | 2        | 1
        3 | 1        | 2
        4 | 3        | 1
        5 | 3        | 2

Table 类别数据:

categoryid| categoryname
----------+--------------
        1 | sports
        2 | events
        3 | news 

如您所见,共有三 (3) 个类别、五 (5) 篇文章和三 (3) 位作者(用户)。他们三个都写过文章,但每个分类只有UserID 3的用户写过文章

我的输出:

  | username
------------
1 | Anne
2 | Joe
3 | Sally

预期输出:

  | username
------------
1 | Anne

我怀疑问题出在 HAVING 子句上,您可以在 HAVING 子句中使用 COUNT(*)COUNT(DISTINCT CategoryID),其余部分相同:

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 table 在 JOIN 中不需要。如果一个用户发布了重复的类别文章,则使用 COUNT(DISTINCT CategoryID) 而不是 COUNT(*)