MySQL Join Where not Exists

J’ai une requête MySQL qui joint deux tables

  • Les électeurs
  • Ménages auxquels ils adhèrent sur elections.household_id et household.id

    Maintenant, ce que je dois faire est de le modifier là où la table des votants est jointe à une troisième table appelée élimination, avec voter.id et. un enregistrement correspondant dans le tableau d’élimination. Comment puis-je créer une requête pour ce faire?

c’est ma requête actuelle

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 

    J’utiliserais probablement une jointure gauche, qui renverrait des lignes même s’il n’y a pas de correspondance, et vous ne pouvez sélectionner que les lignes sans correspondance en recherchant les valeurs NULL.

    Donc, quelque chose comme:

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

    Que ce soit plus ou moins efficace que l’utilisation d’une sous-requête dépend de l’optimisation, des index, de la possibilité d’avoir plus d’une élimination par votant, etc.

    NOT IN vs. NOT EXISTS vs LEFT JOIN / IS NULL

    J’utiliserais un “où n’existe pas” – exactement comme vous le suggérez dans votre titre:

     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 

    Cela peut être légèrement plus rapide que de faire une jointure à gauche (bien sûr, en fonction de vos index, de la cardinalité de vos tables, etc.) et est certainement beaucoup plus rapide que d’utiliser IN.

    Il y a trois façons possibles de le faire.

    1. Option
             SELECT lt. * FROM table_left lt
             JOINT GAUCHE
                 table_right
             ON rt.value = lt.value
             WHT rt.value EST NULL
    
    1. Option
             SELECT lt. * FROM table_left lt
             WHERE lt.value pas dans
             (
             Valeur SELECT
             FROM table_right rt
             )
    
    1. Option
             SELECT lt. * FROM table_left lt
             O NOT N'EXISTE PAS
             (
             SELECT NULL
             FROM table_right rt
             WHT rt.value = lt.value
             )