@KTG

Как корректно построить запрос к двум таблицам?

Есть 2 таблицы:
первая:
UserID - Cat - Group
1200 - 1 - 3
1200 - 4 - 20
1200 - 2 - 7
1235 - 1 - 2
1235 - 4 - 20
1450 - 1 - 3
вторая:
UserID - UserName
1200 - Иван
1235 - Петр
1450 - Дима

Нужно создать запрос, который вернет имя пользователя входящего во все указанные пары Категория-Группа.

На данный момент использую такую конструкцию:
SELECT
   COUNT(UserID)
 , UserName
FROM usertable ut
 INNER JOIN catgrouptable cg ON ut.UserID = cg.UserID
                                              AND (
                                                                (cg.cat = 1 AND cg.group IN (3,10,9))
                                                          OR (cg.cat = 4 AND cg.group IN (1,2,3,20))
                                                         --  неопределенное количество условий вхождения в группы и категории
                                                       )
GROUP BY UsetName
HAVING COUNT(UserID)


Каждый OR - выдает мне вхождение в одну из групп по соответствующей категории
Через COUNT я считаю выполнение условия для одной из пар.
HAVING оставляет только те записи что прошли все условия.

Но меня всегда смущает использование конструкции HAVING. Поэтому вопрос, есть ли более изящное решение, которое бы к тому же исключало ошибку когда пользователь имеет более одной группы в категории.
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
@KTG Автор вопроса
Можно избежать ошибки задвоения записи, если пользователь в одной категории имеет более 1 группы сделав еще одну обертку из Select с группировкой, и подсчет вхождений вынести

SELECT
    COUNT(UserID)
  , UserName
  FROM 
    (
    SELECT
        UserID
      , UserName
      , Cat
      FROM usertable ut
        INNER JOIN catgrouptable cg ON ut.UserID = cg.UserID
          AND (
                       (cg.cat = 1 AND cg.group IN (3,10,9))
                    OR (cg.cat = 4 AND cg.group IN (1,2,3,20))
                     --  неопределенное количество условий вхождения в группы и категории
                   )
      GROUP BY UserID, UserName, Cat
    )
GROUP BY UserName
HAVING COUNT(UserID) = 2 -- число проверяемых категорий
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
idShura
@idShura
Так?
select t2.UserName
 from TAB1 t1 
      left join TAB2 t2 on t2.UserID = t1.UserID
where (t1.cat = 1 AND t1.group IN (3,10,9))
   OR (t1.cat = 4 AND t1.group IN (1,2,3,20))
   --  неопределенное количество условий вхождения в группы и категории
group by t2.UserName
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы