MySQL Join Где не существует
У меня есть запрос MySQL, который объединяет две таблицы
- Голосовавшие
- Домохозяйства
они присоединяются к избирателям .household_id и hous.id
Теперь то, что мне нужно сделать, это изменить его, когда таблица избирателей присоединяется к третьей таблице, называемой устранением, по элементу voter.id и elim.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
Ответы
Ответ 1
Я бы, вероятно, использовал Left Join, который вернет строки, даже если их нет, и вы можете выбрать только строки без соответствия, проверив NULL.
Итак, что-то вроде:
SELECT V.*
FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id
WHERE E.voter_id IS NULL
Насколько более или менее эффективен, чем использование подзапроса, зависит от оптимизации, индексов, возможно ли иметь более одного исключения для каждого избирателя и т.д.
Ответ 2
NOT IN vs. NOT EXISTS против LEFT JOIN/IS NULL
Ответ 3
Я бы использовал "где не существует" - точно так же, как вы предлагаете в своем названии:
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.
Ответ 4
Есть три возможных способа сделать это.
SELECT lt.* FROM table_left l
LEFT JOIN
table_right r
ON rt.value = lt.value
WHERE rt.value IS NULL
- Опция
SELECT lt.* FROM table_left l
WHERE lt.value NOT IN
(
SELECT value
FROM table_right r
)
- Опция
SELECT lt.* FROM table_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM table_right r
WHERE rt.value = lt.value
)