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 要快得多。
有三种可能的方法来做到这一点。
- 选项
SELECT lt。* FROM table_left l 左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值 FROM table_right r )
- 选项
SELECT lt。* FROM table_left l 不存在的地方 ( SELECT NULL FROM table_right r WHERE rt.value = lt.value )