89

2 つのテーブルを結合する MySQL クエリがあります

  • 有権者
  • 世帯

彼らは参加しvoters.household_idhousehold.id.

今私がする必要があるのは、voter テーブルが と に沿って、除去と呼ばれる 3 番目のテーブルに結合されている場所を変更することvoter.idですelimination.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 
4

4 に答える 4

223

一致がない場合でも行を返す a を使用すると、 sLEFT JOINをチェックして一致しない行のみを選択できますNULL

したがって、次のようなものです:

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

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

于 2009-04-15T05:20:18.900 に答える
10

タイトルで提案されているとおり、「存在しない場所」を使用します。

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を使用するよりもほぼ確実にはるかに高速です。

于 2009-05-08T16:49:01.897 に答える