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
         )