SQL запрос. Связь many to many с условием AND

Дано:
table users:
id
1
2
3


table info:
id
1
2
3


table users_info:
id | user_id | info_id
1        1          1
2        1          2
3        1          3
4        2          2
5        2          3
6        3          1
7        3          2

Нужно:
сделать выборку пользователей из базы, у которых одновременно info.id = 1 AND info.id = 2 AND info.id = 3

<b>Результат должен быть:</b>
table result:
user_id
1
  • Вопрос задан
  • 4647 просмотров
Пригласить эксперта
Ответы на вопрос 4
egor_nullptr
@egor_nullptr
select user_id, group_concat(distinct info_id order by info_id asc) as _i
from user_info where info_id between 1 and 3 group by user_id
having _i = '1,2,3';

В отличие от предложенного выше варианта, для этого запроса неважна уникальность связки user_id, info_id.
Ответ написан
Комментировать
Предложу немного модифированный вариант @kazmiruk
SELECT user_id  FROM users_info WHERE info_id IN ( 2,3,1 ) GROUP BY user_id  HAVING COUNT(user_id) =3

"3" - число элементов в операторе IN.
Ответ написан
@kirillzorin
Более общий вариант:
select user_id from users_info as info
group by user_id
having count(case when info.id = 1 then 1 end) > 0 
   and count(case when info.id = 2 then 1 end) > 0 
   and count(case when info.id = 3 then 1 end) > 0;

Туда можно и другие условия добавить.
Ответ написан
Комментировать
amr-dallin
@amr-dallin
Разработка на CakePHP
Написал решение данной задачи в предыдущем вопросе. Ознакомьтесь.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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