В моей базе данных я хочу группировать пользователей, и я использую три таблицы: Пользователи, Категории и Статьи.
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 для определения условия (то есть, только пользователи, которые опубликовали статьи в таком количестве различных категорий, сколько существует), ноКажется, он не работает, так как он будет выбирать всех пользователей, которые опубликовали статьи, независимо от категории.
Я попытался поставить условие ГДЕ вместо использования HAVING (я все еще не уверен насчет различий междудва), но я получил тот же результат.Я попытался посчитать разные CategoryID из таблицы Articles вместо таблицы Categories тоже, но все равно получил тот же результат.
Чего мне не хватает?
Данные таблицы пользователей:
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