Я хочу получить всех пользователей, которые соответствуют нескольким условиям объединения.
Вот упрощенный пример с этой базой данных:
create table users(id int, name varchar);
insert into users values(1, "caroline");
insert into users values(2, "simon");
insert into users values(3, "jose");
insert into users values(4, "robert");
create table tags(value varchar, user_id integer);
insert into tags values("a", 1); insert into tags values("b", 1);
insert into tags values("a", 2);insert into tags values("b", 3);
insert into tags values("c", 4);
Я хочу получить пользователя, который имееттег 'a' и тег 'b' (каролина).
Если я выполню этот запрос: SELECT * from users INNER JOIN tags ON users.id = tags.user_id WHERE tags.value IN ('a', 'b');
Он вернет всех пользователей, которые соответствуют одному из двух условий:
1|caroline|a|1
1|caroline|b|1
2|simon|a|2
3|jose|b|3
Если я выполню этот запрос:
SELECT * FROM users where users.id IN (
SELECT users.id from users INNER JOIN tags ON users.id = tags.user_id WHERE tags.value = 'a'
INTERSECT
SELECT users.id from users INNER JOIN tags ON users.id = tags.user_id WHERE tags.value = 'b');
Это работает. Возвращается только Кэролайн.
Но в этом случае это 3 выбранных запроса. Но реально ли использовать, если у меня есть 5 тегов для поиска, это будет 6 выбранных запросов.
Есть ли лучшие решения для создания подзапросов?