Ich habe eine MySQL-Abfrage, die zwei Tabellen verbindet
- Wähler
- Haushalte
Sie schließen sich an voters.household_id
und household.id
.
Nun , was ich tun müssen , ist , es zu ändern , wo die Wähler Tabelle in eine dritte Tabelle namens Beseitigung verbunden ist, zusammen voter.id
und elimination.voter_id
. Der Haken ist jedoch, dass ich alle Datensätze in der Wählertabelle ausschließen möchte, die einen entsprechenden Datensatz in der Eliminierungstabelle haben.
Wie erstelle ich eine Abfrage, um dies zu tun?
Dies ist meine aktuelle Anfrage:
SELECT `voter`.`ID`, `voter`.`Last_Name`, `voter`.`First_Name`,
`voter`.`Middle_Name`, `voter`.`Age`, `voter`.`Sex`,
`voter`.`Party`, `voter`.`Demo`, `voter`.`PV`,
`household`.`Address`, `household`.`City`, `household`.`Zip`
FROM (`voter`)
JOIN `household` ON `voter`.`House_ID`=`household`.`id`
WHERE `CT` = '5'
AND `Precnum` = 'CTY3'
AND `Last_Name` LIKE '%Cumbee%'
AND `First_Name` LIKE '%John%'
ORDER BY `Last_Name` ASC
LIMIT 30
quelle
SELECT V.* FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id OR E.voter_id IS NULL
: Wenn Sie nicht alle Datensätze für jede Zeile von links in der rechten Tabelle speichern möchten.E
, wannE.voter_id
sie sichNULL
in dem Datensatz befinden können, aus dem wir stammenJOIN
?SELECT V.*, COUNT(E.*) AS `countE` FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id WHERE countE = 0;
Ich würde ein "wo nicht existiert" verwenden - genau wie Sie es in Ihrem Titel vorschlagen:
SELECT `voter`.`ID`, `voter`.`Last_Name`, `voter`.`First_Name`, `voter`.`Middle_Name`, `voter`.`Age`, `voter`.`Sex`, `voter`.`Party`, `voter`.`Demo`, `voter`.`PV`, `household`.`Address`, `household`.`City`, `household`.`Zip` FROM (`voter`) JOIN `household` ON `voter`.`House_ID`=`household`.`id` WHERE `CT` = '5' AND `Precnum` = 'CTY3' AND `Last_Name` LIKE '%Cumbee%' AND `First_Name` LIKE '%John%' AND NOT EXISTS ( SELECT * FROM `elimination` WHERE `elimination`.`voter_id` = `voter`.`ID` ) ORDER BY `Last_Name` ASC LIMIT 30
Dies ist möglicherweise geringfügig schneller als ein Link-Join (natürlich abhängig von Ihren Indizes, der Kardinalität Ihrer Tabellen usw.) und mit ziemlicher Sicherheit viel schneller als die Verwendung von IN.
quelle
Dafür gibt es drei Möglichkeiten.
Möglichkeit
SELECT lt.* FROM table_left lt LEFT JOIN table_right rt ON rt.value = lt.value WHERE rt.value IS NULL
Möglichkeit
SELECT lt.* FROM table_left lt WHERE lt.value NOT IN ( SELECT value FROM table_right rt )
Möglichkeit
SELECT lt.* FROM table_left lt WHERE NOT EXISTS ( SELECT NULL FROM table_right rt WHERE rt.value = lt.value )
quelle