2つのテーブルを結合するMySQLクエリがあります
それらが有権者に参加する世帯。
今私がする必要があるのは、voter.idと消去テーブル内の対応するレコード。これを行うクエリを作成するにはどうすればよいですか?
これは私の現在のクエリです
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
おそらく、一致しなくても行を返すLeft Joinを使用します。NULLをチェックすることで、一致しない行のみを選択できます。
だから、次のようなもの:
SELECT V.*
FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id
WHERE E.voter_id IS NULL
サブクエリを使用するよりも効率が良いか低いかは、最適化、インデックス、投票者ごとに複数の削除が可能かどうかなどに依存します。
タイトルにあるとおり、「存在しない場所」を使用します。
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
これは、左の結合を行うよりもわずかに速いかもしれません(もちろん、インデックス、テーブルのカーディナリティなどによって異なります)。ほぼ確実にmuch INを使用するよりも速くなります。
それを行うには3つの方法があります。
SELECT lt。* FROM table_left lt LEFT JOIN table_right rt ON rt.value = lt.value WHERE rt.value IS NULL
SELECT lt。* FROM table_left lt WHERE lt.value NOT IN ( SELECT value FROM table_right rt )
SELECT lt。* FROM table_left lt WHERE NOT EXISTS ( SELECT NULL FROM table_right rt WHERE rt.value = lt.value )