Es gibt viele Möglichkeiten, um das zu erreichen, wonach Sie fragen. Am einfachsten ist es vielleicht, einen rein satzorientierten Ansatz zu verwenden:
select election_id from elections
minus -- except is used instead of minus by some vendors
select election_id from votes where user_id = ?
Aus der Reihe der Wahlen entfernen wir diejenigen, bei denen der Benutzer abgestimmt hat. Das Ergebnis kann mit Wahlen verbunden werden, um den Titel der Wahlen zu erhalten. Auch wenn Sie Ihre Frage nicht mit Tags versehen haben, besteht Grund zu der Annahme, dass Sie MySQL verwenden und MINUS oder EXCEPT dort nicht unterstützt werden.
Eine andere Variante besteht darin, das NOT EXISTS
Prädikat zu verwenden:
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 = ?
);
Dh bei der Wahl, bei der es keine Abstimmung vom Nutzer gibt. Das NOT IN
Prädikat kann auf ähnliche Weise verwendet werden. Da es sich möglicherweise um Nullen handelt, ist zu beachten, dass sich die Semantik zwischen IN und EXISTS unterscheidet.
Schließlich können Sie eine äußere Verknüpfung verwenden
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;
Wenn es keine Zeilen gibt, die mit den ON-Prädikaten übereinstimmen, werden alle Spalten von votes im Ergebnis durch null ersetzt. Wir können daher überprüfen, ob eine Spalte von Stimmen in der WHERE-Klausel null ist. Da beide Spalten in Stimmen möglicherweise null sind, müssen Sie vorsichtig sein.
Idealerweise sollten Sie Ihre Tabellen so korrigieren, dass Sie sich nicht mit den durch Nullen verursachten Fallstricken befassen müssen:
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)
);