Tengo una consulta MySQL que une dos tablas
- Votantes
- Hogares
Se unen a voters.household_id
y household.id
.
Ahora lo que tengo que hacer es modificarlo donde la mesa de votantes se une a una tercera mesa llamada eliminación, junto con voter.id
y elimination.voter_id
. Sin embargo, el problema es que quiero excluir cualquier registro en la tabla de votantes que tenga un registro correspondiente en la tabla de eliminación.
¿Cómo creo una consulta para hacer esto?
Esta es mi consulta actual:
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
fuente
SELECT V.* FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id OR E.voter_id IS NULL
ej .: si U no desea almacenar todos los registros en la tabla de la derecha para cada fila de la izquierda.E
, cuándoE.voter_id
puede estarNULL
en el conjunto de datos del que venimosJOIN
?SELECT V.*, COUNT(E.*) AS `countE` FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id WHERE countE = 0;
Usaría un 'donde no existe', exactamente como sugieres en tu título:
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
Eso puede ser un poco más rápido que hacer una combinación izquierda (por supuesto, dependiendo de sus índices, cardinalidad de sus tablas, etc.), y es casi seguro que es mucho más rápido que usar IN.
fuente
Hay tres formas posibles de hacerlo.
Opción
SELECT lt.* FROM table_left lt LEFT JOIN table_right rt ON rt.value = lt.value WHERE rt.value IS NULL
Opción
SELECT lt.* FROM table_left lt WHERE lt.value NOT IN ( SELECT value FROM table_right rt )
Opción
SELECT lt.* FROM table_left lt WHERE NOT EXISTS ( SELECT NULL FROM table_right rt WHERE rt.value = lt.value )
fuente