Запрос MySQL для выбора пользователей выбрал только одну категорию

#mysql #subquery

#mysql #подзапрос

Вопрос:

У меня есть таблица с данными, похожими на приведенные ниже

 id  UserId  Category
1    5001       A
2    5001       B
3    5002       A
4    5003       B
5    5004       A
6    5001       A
  

1) Как нам запросить таблицу, которая может принести мне пользователей, которые зарегистрировались только для категории. Пользователь не должен быть зарегистрирован для B или любой другой категории.
Для приведенных выше данных он должен возвращать только меня

 3    5002       A
  

2) Как нам написать запрос, который может извлекать пользователей, зарегистрированных как для категории A, так и для категории B. Не только A и не только B
Для приведенного выше, он должен возвращать мне только

 userId - 5001
  

Кто-нибудь может помочь в этом?

Ответ №1:

Вы можете использовать следующее решение, используя IN :

 SELECT DISTINCT UserID, Category
FROM table_name t
WHERE Category = 'A' AND UserID NOT IN (
    SELECT UserID 
    FROM table_name
    WHERE Category <> t.Category
);
  

Другое решение, использующее EXISTS :

 SELECT DISTINCT UserID, Category
FROM table_name t
WHERE Category = 'A' AND NOT EXISTS (
    SELECT 1 
    FROM table_name 
    WHERE UserID = t.UserID AND Category <> t.Category
);
  

Чтобы получить второй результат, вы можете использовать следующее решение, используя INNER JOIN :

 SELECT DISTINCT t.UserId
FROM table_name t INNER JOIN (
    SELECT UserId 
    FROM table_name
    WHERE Category = 'B'
) b ON t.UserId = b.UserId
WHERE t.Category = 'A'
  

Другое решение, использующее EXISTS :

 SELECT DISTINCT UserID
FROM table_name t
WHERE Category = 'A' AND EXISTS (
    SELECT 1 
    FROM table_name
    WHERE UserID = t.UserID AND Category = 'B'
);
  

демонстрация на dbfiddle.uk

Комментарии:

1. Идеальный… Большое спасибо