我有两张表,我只需要一张表 ( list
) 中没有出现在第二张表 ( 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
列上匹配。但是第二个看起来应该基于 我在网上看到的 其他答案 。
我预计将返回大约 1700000 - 2000000 行。但肯定不是 0 或全表。我应该如何措辞查询?这是在 Amazon RDS 中运行的 MySQL 5.5.33。
MySQL,事实上,所有的 SQL 产品都非常讨厌
它会引起混乱。你真的是说
您需要将其更改为
试试看 !!!
关于您的问题
您的第一个查询
类似于自然连接,在基数表上没有任何匹配项,因此计数
2677513
是正确的。您的第二个查询
稍微明确一点,但
c.id=null
它会失败,因此计数为 0。