MySQL Join Where Not Exists

前端 未结 3 1256
孤街浪徒
孤街浪徒 2020-12-02 10:12

I have a MySQL query that joins two tables

  • Voters
  • Households

They join on voters.household_id and household.id

相关标签:
3条回答
  • 2020-12-02 10:42

    There are three possible ways to do that.

    1. Option

      SELECT  lt.* FROM    table_left lt
      LEFT JOIN
          table_right rt
      ON      rt.value = lt.value
      WHERE   rt.value IS NULL
      
    2. Option

      SELECT  lt.* FROM    table_left lt
      WHERE   lt.value NOT IN
      (
      SELECT  value
      FROM    table_right rt
      )
      
    3. Option

      SELECT  lt.* FROM    table_left lt
      WHERE   NOT EXISTS
      (
      SELECT  NULL
      FROM    table_right rt
      WHERE   rt.value = lt.value
      )
      
    0 讨论(0)
  • 2020-12-02 10:45

    I'd use a 'where not exists' -- exactly as you suggest in your title:

    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
    

    That may be marginally faster than doing a left join (of course, depending on your indexes, cardinality of your tables, etc), and is almost certainly much faster than using IN.

    0 讨论(0)
  • 2020-12-02 10:57

    I'd probably use a LEFT JOIN, which will return rows even if there's no match, and then you can select only the rows with no match by checking for NULLs.

    So, something like:

    SELECT V.*
    FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id
    WHERE E.voter_id IS NULL
    

    Whether that's more or less efficient than using a subquery depends on optimization, indexes, whether its possible to have more than one elimination per voter, etc.

    0 讨论(0)
提交回复
热议问题