如何仅选择具有特定价值的用户?

时间:2018-11-26 09:50:54

标签: sql sql-server join group-by having

在数据库中,我想按用户分组,并且使用三个表:“用户”,“类别”和“文章”。

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

1 个答案:

答案 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(*)