Подтвердить что ты не робот

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 
4b9b3361

Ответ 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

Насколько более или менее эффективен, чем использование подзапроса, зависит от оптимизации, индексов, возможно ли иметь более одного исключения для каждого избирателя и т.д.

Ответ 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
  1. Опция
        SELECT  lt.* FROM    table_left l
        WHERE   lt.value NOT IN
        (
        SELECT  value
        FROM    table_right r
        )
  1. Опция
        SELECT  lt.* FROM    table_left l
        WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    table_right r
        WHERE   rt.value = lt.value
        )