выберите users.user_id, users.display_name из пользователей, контакты как c, где c.user_id =: user_id и c.contact_id = users.user_id и не существует (выберите user_id из пользовательских файлов как uf, где uf.user_id = c.contact_idи uf.file_id in (: file_ids));
Обратите внимание, что :file_ids
- это все ваши file_id, разделенные запятыми.Больше никаких циклов для выполнения нескольких запросов!
РЕДАКТИРОВАТЬ:
Это данные, которые я запускаю в качестве теста:
create table users (user_id integer primary key, display_name text);
insert into users values (1,"bob");
insert into users values (2,"jim");
insert into users values (3,"bill");
insert into users values (4,"martin");
insert into users values (5,"carson");
create table contacts values (user_id integer, contact_id integer);
insert into contacts select u1.user_id, u2.user_id from users u1, users u2 where ui.user_id!=u2.user_id;
create table userfiles (user_id integer, file_id integer);
insert into userfiles values (1,10);
insert into userfiles values (2,10);
insert into userfiles values (3,10);
insert into userfiles values (4,10);
insert into userfiles values (1,20);
insert into userfiles values (2,30);
Затем, если я запустил свой запросс :user_id
= 5 и :files_id
= 20,30 я получаю:
select users.user_id, users.display_name
from users, contacts as c
where c.user_id = 5
and c.contact_id = users.user_id
and not exists (
select user_id
from userfiles as uf
where uf.user_id = c.contact_id
and uf.file_id in (20,30)
);
UserID|Display_Name
3 |bill
4 |martin
Кажется, что вы хотите, насколько я понимаю, то есть единственные пользователи, у которых нет всехидентификаторы файлов.Если я что-то неправильно понял, пожалуйста, дайте мне знать.