Я бы, вероятно, сделал
create table request (
id int not null primary key auto_increment,
date_requested timestamp,
user_id int,
filename varchar(255),
status enum('new','verified','rejected') not null default 'new',
foreign key(user_id) references user(id)
);
create table verify (
id int not null primary key auto_increment,
user_id int,
request_id int,
created timestamp,
status enum('verified','rejected') not null default 'new',
foreign key(request_id) references request(id)
);
Если вы хотите обновить статус запроса, можете просто сделать
update request
inner join (select request_id,count(*) as users from verify where status = 'verified' group by verify having users>1) t2
on (request.id = request_id)
set request.status = 'verified'
where request.status = 'new';
update request
inner join (select request_id,count(*) as users from verify where status = 'rejected' group by verify having users>1) t2
on (request.id = request_id)
set request.status = 'rejected'
where request.status = 'new';
Или просто отфильтровать запросы во время запроса (без необходимость «поддерживать» столбец в таблице запросов.
select request.*,count(*) as verified from request
inner join verify on (request.id = request_id and status = 'verified')
group by request_id
having verified>1
Или может найти непроверенные элементы (для просмотра!
select request.*,count(*) as processed from request
inner join verify on (request.id = request_id)
group by request_id
having processed<2
ie любой запрос, содержащий менее двух строк в проверке.
Хотя он не имеет дело с одним принять, а один отклонить! .. чтобы получить как минимум два из любого ответа
select request.*,count(*) as processed from request
inner join verify on (request.id = request_id)
group by request_id,verify.status
having processed<2