Как выбрать только пользователей с определенным значением? - PullRequest
0 голосов
/ 26 ноября 2018

В моей базе данных я хочу группировать пользователей, и я использую три таблицы: Пользователи, Категории и Статьи.

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

1 Ответ

0 голосов
/ 26 ноября 2018

Я подозреваю, что проблема в предложении 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(*).

...