원하는 것을 달성 할 수있는 많은 방법이 있습니다. 아마도 가장 간단한 방법은 순전히 설정 지향 접근법을 사용하는 것입니다.
select election_id from elections
minus -- except is used instead of minus by some vendors
select election_id from votes where user_id = ?
선거에서 우리는 사용자가 투표 한 선거를 제거합니다. 선거 제목을 얻기 위해 선거와 결과를 결합 할 수 있습니다. 질문에 태그를 지정하지 않았더라도 MySQL을 사용하고 있다고 생각할만한 이유가 있으며 MINUS 또는 EXCEPT는 지원되지 않습니다.
다른 변형은 NOT EXISTS
술어 를 사용하는 것입니다 .
select election_id, title
from elections e
where not exists (
select 1
from votes v
where e.election_id = v.election_id
and v.user_id = ?
);
즉, 사용자의 투표가없는 선거. NOT IN
조건은 비슷한 방식으로 사용할 수 있습니다. 관련된 null이있을 수 있으므로 의미와 IN과 EXISTS가 다르다는 점에 주목할 가치가 있습니다.
마지막으로 외부 조인을 사용할 수 있습니다
select election_id, title
from elections e
left join votes v
on e.election_id = v.election_id
and v.user_id = ?
where v.user_id is null;
ON 술어와 일치하는 행이 없으면 투표의 모든 열이 결과에서 널로 바뀝니다. 따라서 WHERE 절에서 votes의 열이 null인지 확인할 수 있습니다. 투표의 두 열이 모두 null 일 수 있으므로주의해야합니다.
이상적으로는 널로 인한 문제를 처리하지 않아도되도록 테이블을 수정해야합니다.
CREATE TABLE elections
( election_id int NOT NULL AUTO_INCREMENT PRIMARY KEY
, title varchar(255) not null );
CREATE TABLE votes
( election_id int not null
, user_id int not null
, constraint pk_votes primary key (election_id, user_id)
, constraint fk_elections foreign key (election_id)
references elections (election_id)
);