Tengo una consulta MySQL que une dos tablas
- Votantes
- Hogares
Se unen a voters.household_idy 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.idy 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 NULLej .: si U no desea almacenar todos los registros en la tabla de la derecha para cada fila de la izquierda.E, cuándoE.voter_idpuede estarNULLen 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 30Eso 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 NULLOpció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