У меня есть запрос MySQL, который объединяет две таблицы
- Избиратели
- Домохозяйства
Они присоединяются к voters.household_id
и household.id
.
Теперь мне нужно изменить его, где таблица избирателей соединена с третьей таблицей, называемой исключением, вместе с voter.id
и elimination.voter_id
. Однако загвоздка в том, что я хочу исключить любые записи в таблице избирателей, у которых есть соответствующая запись в таблице исключения.
Как мне создать запрос для этого?
Это мой текущий запрос:
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
источник
SELECT V.* FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id OR E.voter_id IS NULL
например: если U не хочет хранить все записи в правой таблице для каждой строки слева.E
, когда ониE.voter_id
могут бытьNULL
в наборе данных, из которого мы находимсяJOIN
?SELECT V.*, COUNT(E.*) AS `countE` FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id WHERE countE = 0;
Я бы использовал «там, где не существует» - именно так, как вы предлагаете в своем заголовке:
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
Это может быть немного быстрее, чем выполнение левого соединения (конечно, в зависимости от ваших индексов, количества элементов ваших таблиц и т.д.), и почти наверняка намного быстрее, чем использование IN.
источник
Это можно сделать тремя способами.
Вариант
SELECT lt.* FROM table_left lt LEFT JOIN table_right rt ON rt.value = lt.value WHERE rt.value IS NULL
Вариант
SELECT lt.* FROM table_left lt WHERE lt.value NOT IN ( SELECT value FROM table_right rt )
Вариант
SELECT lt.* FROM table_left lt WHERE NOT EXISTS ( SELECT NULL FROM table_right rt WHERE rt.value = lt.value )
источник