我想检索所有符合多个加入条件的用户。
这是此数据库的简化示例:
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”(caroline)。
如果我运行以下查询:
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个选择查询。
是否有更好的解决方案来创建子查询?