MySQLjoin不存在的地方

我有一个连接两个表的MySQL查询

  • 选民
  • 他们join的居民是vot.household_id和household.id

    现在我需要做的是修改它的选民表join第三个表名为消除,沿voter.id和elimination.voter_id,如何捕捉是我想排除在选民表中有任何logging清除表中的相应logging。 我如何制作一个查询来做到这一点?

这是我目前的查询

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 

    我可能会使用左连接,即使没有匹配也会返回行,然后通过检查NULL来只select没有匹配的行。

    所以,像这样的:

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

    是否比使用子查询效率更高或更低取决于优化,索引,每个选民可能有多个淘汰等等。

    不在与不存在与左连接/为空

    我会使用“不存在的地方” – 正如您在标题中所build议的那样:

     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 快得多。

    有三种可能的方法来做到这一点。

    1. 选项
             SELECT lt。* FROM table_left l
            左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值
             FROM table_right r
             )
    
    1. 选项
             SELECT lt。* FROM table_left l
            不存在的地方
             (
             SELECT NULL
             FROM table_right r
             WHERE rt.value = lt.value
             )