2つのテーブルがあり、1つのテーブル(list
)に表示され、2番目のテーブル(cardinal
)には表示されない結果のみが必要です。 list
テーブルの主キーはsku
であり、テーブルには古いid
列があります(これは現時点ではアプリケーションで実際には使用されていません)。 cardinal
テーブルの主キーはid
です。テーブルを結合する列はsku
です。これらはテーブルです(関連フィールドのみ、ここに貼り付けなかった他のフィールドがあります):
mysql> describe list;
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(63) | YES | | NULL | |
| sku | bigint(20) | NO | PRI | 0 | |
+-----------------+--------------+------+-----+---------+-------+
mysql> describe cardinal;
+------------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| sku | bigint(20) | YES | MUL | NULL | |
+------------------+-------------+------+-----+---------+----------------+
各テーブルのレコード数は次のとおりです。
mysql> SELECT count(*) FROM list;
+----------+
| 2677513 |
+----------+
mysql> SELECT count(*) FROM cardinal;
+----------+
| 970924 |
+----------+
cardinal
テーブルのすべてのレコードにはsku
列の有効なエントリがあり、これらの有効なエントリはすべてlist
テーブルに存在します。 いくつかの重複が存在しますsku
テーブルのcardinal
に対して。
list
テーブルに対応するエントリがないcardinal
テーブルのすべてのレコードが必要です。ただし、私が試みているすべてのメソッドは、list
テーブルのすべてのレコードを返すか、まったくレコードを返さない!
mysql> SELECT count(*) FROM list l LEFT JOIN cardinal c ON c.id=null;
+----------+
| count(*) |
+----------+
| 2677513 |
+----------+
1 row in set (0.49 sec)
mysql> SELECT count(*) FROM list l LEFT OUTER JOIN cardinal c ON l.sku=c.sku where c.id=null;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
最初のクエリは、sku
列で一致することを明らかに認識していません。しかし、2番目のものは動作するはずです ベースon他の回答私がしたことseenオンライン 。
約1700000-2000000行が返されることを期待しています。ただし、0またはテーブル全体ではありません。クエリをどのように表現すればよいですか?これは、Amazon RDSで実行されているMySQL 5.5.33です。
MySQL、実際、すべてのSQL製品は、
c.id=NULL
それは混乱を引き起こします。あなたは本当に意味します
c.id IS NULL
に変更する必要があります
SELECT count(*) FROM list l LEFT OUTER JOIN cardinal c ON l.sku=c.sku where c.id is null;
試してみる !!!
最初のクエリ
SELECT count(*) FROM list l LEFT JOIN cardinal c ON c.id=null;
カーディナルテーブルで何も一致しない自然な結合に似ているため、カウント2677513
正しい。
2番目のクエリ
SELECT count(*) FROM list l LEFT OUTER JOIN cardinal c ON l.sku=c.sku where c.id=null;
もう少し明示的ですが、c.id=null
は失敗するため、0がカウントされます。