web-dev-qa-db-ja.com

MySQLが存在しない場所に参加する

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 
66
gsueagle2008

おそらく、一致しなくても行を返すLeft Joinを使用します。NULLをチェックすることで、一致しない行のみを選択できます。

だから、次のようなもの:

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

サブクエリを使用するよりも効率が良いか低いかは、最適化、インデックス、投票者ごとに複数の削除が可能かどうかなどに依存します。

159
NickZoic

タイトルにあるとおり、「存在しない場所」を使用します。

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を使用するよりも速くなります。

5
Ian Clelland

それを行うには3つの方法があります。

  1. オプション
 SELECT lt。* FROM table_left lt 
 LEFT JOIN 
 table_right rt 
 ON rt.value = lt.value 
 WHERE rt.value IS NULL 
  1. オプション
 SELECT lt。* FROM table_left lt 
 WHERE lt.value NOT IN 
(
 SELECT value 
 FROM table_right rt 
) 
  1. オプション
 SELECT lt。* FROM table_left lt 
 WHERE NOT EXISTS 
(
 SELECT NULL 
 FROM table_right rt 
 WHERE rt.value = lt.value 
)
3