如何 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(*)
。
在我的数据库中,我想按用户分组,我使用了三个 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(*)
。