Ada banyak cara untuk mencapai apa yang Anda minta. Mungkin cara yang paling mudah adalah dengan menggunakan pendekatan berorientasi murni yang ditetapkan:
select election_id from elections
minus -- except is used instead of minus by some vendors
select election_id from votes where user_id = ?
Dari rangkaian pemilihan, kami menghapus yang telah dipilih oleh pengguna. Hasilnya bisa digabungkan dengan pemilihan untuk mendapatkan judul pemilihan. Meskipun Anda belum menandai pertanyaan Anda, ada alasan untuk percaya bahwa Anda menggunakan MySQL, dan MINUS atau KECUALI tidak didukung di sana.
Varian lain adalah dengan menggunakan NOT EXISTS
predikat:
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 = ?
);
Yaitu pemilihan di mana tidak ada suara dari pengguna. The NOT IN
predikat dapat digunakan dengan cara yang sama. Karena mungkin ada nulls yang terlibat, perlu dicatat bahwa semantiknya berbeda antara IN dan EXIS.
Akhirnya, Anda bisa menggunakan gabungan luar
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;
Jika tidak ada baris yang cocok dengan predikat ON, semua kolom dari suara diganti dengan nol pada hasilnya. Karena itu, kami dapat memeriksa apakah kolom dari suara tidak ada dalam klausa WHERE. Karena kedua kolom dalam suara mungkin nol, Anda harus berhati-hati.
Idealnya, Anda harus memperbaiki tabel Anda sehingga Anda tidak harus berurusan dengan gotcha yang disebabkan oleh nol:
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)
);