มีหลายวิธีในการบรรลุสิ่งที่คุณขอ บางทีวิธีที่ตรงไปตรงมาที่สุดคือการใช้วิธีการที่มุ่งเน้นอย่างหมดจด:
select election_id from elections
minus -- except is used instead of minus by some vendors
select election_id from votes where user_id = ?
จากชุดการเลือกตั้งเราจะลบรายการที่ผู้ใช้โหวต ผลที่ได้สามารถเข้าร่วมกับการเลือกตั้งเพื่อให้ได้ตำแหน่งการเลือกตั้ง แม้ว่าคุณจะไม่ได้ติดแท็กคำถามของคุณ แต่ก็มีเหตุผลที่เชื่อได้ว่าคุณกำลังใช้งาน MySQL และไม่รองรับหรือลบหรือลบออก
อีกตัวแปรหนึ่งคือใช้เพรดิเคต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
สามารถใช้ในลักษณะที่คล้ายกัน เนื่องจากอาจมีค่าว่างที่เกี่ยวข้องจึงควรสังเกตว่าความหมายแตกต่างระหว่าง 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 หรือไม่ เนื่องจากทั้งสองคอลัมน์ในการโหวตอาจเป็นโมฆะคุณต้องระวัง
เป็นการดีที่คุณควรแก้ไขตารางของคุณเพื่อให้คุณไม่ต้องจัดการกับ gotchas ที่เกิดจาก nulls:
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)
);