如何比较两列以在MySQL中找到不匹配的记录

ron*_*kap 6 mysql

我有一个包含2列的MySQL表,每列有数千条记录

对于示例15000第1列中的电子邮件地址和第2列中的15005电子邮件地址

如何找到15005中5列中无法比拟的记录?

我希望MySql查询比较两列,并只给出5个不匹配记录的结果

谢谢

Mos*_*cho 18

不确定我是否正确......但它会是什么样的?

select column2 from table
where column2 not in (select column1 from table)
Run Code Online (Sandbox Code Playgroud)

  • @ronniekap,你应该接受他的回答. (6认同)

小智 8

理查德,从表中的一列中找到匹配/缺少的行与同一表中的另一列相比,这是非常不寻常的.

您可以将表视为事实的集合,每行都是一个事实.将值转换为谓词是我们理解数据的方式.一个表中的值"12"可能表示"存在12个小部件的日期"或"1月1日12个人购买小部件"或"1月12日没有销售小部件",但无论如何表的对应谓词是"12"应该代表一个事实.

想要找出两个表之间的区别是很常见的:"B中哪些事实不属于A?" 但是在一个包含两列的表中,每一行在概念上应该是关于这对值的事实.行(12,13)的谓词可能是"1月12日,我们卖掉了13个小部件." 但在那种情况下,我怀疑你是否会要求提供这些信息.

所以,如果(12,13)真的是同一个谓词中的两个 - "12区的某人购买了小部件,并且13区的某人购买了小部件" - 从长远来看,如果这些是一列,生活会更容易不是两个.如果它是两个不同的谓词,那么它们在两个表中会更有意义.SQL的灵活性可以处理这些情况,但您可能会在以后遇到更多问题.如果您对此主题感兴趣,搜索"规范化"会找到比您想知道的更多的方法:)

无论如何,我认为您正在寻找的查询使用LEFT JOIN来比较表格与自身.我将值1-15000添加到col1,将1-15005添加到此表中的col2:

CREATE TABLE `foo` (
  `col1` int(11) DEFAULT NULL,
  `col2` int(11) DEFAULT NULL,
  KEY `idx_col1` (`col1`),
  KEY `idx_col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

mysql> select count(distinct col1), count(distinct col2) from foo;
+----------------------+----------------------+
| count(distinct col1) | count(distinct col2) |
+----------------------+----------------------+
|                15000 |                15005 |
+----------------------+----------------------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

通过给同一个表两个名称,我可以将它们的两列相互比较,并找到没有相应col1值的col2值 - 在这些情况下,f1.col1将为NULL:

mysql> select f2.col2
from foo as f2 left join foo as f1 on (f2.col2=f1.col1)
where f1.col1 is null;
+-------+
| col2  |
+-------+
| 15001 |
| 15002 |
| 15003 |
| 15004 |
| 15005 |
+-------+
5 rows in set (0.03 sec)
Run Code Online (Sandbox Code Playgroud)

关于莫斯蒂昨天的解决方案,我不确定这是否正确.我尽量不使用子查询,所以我在这里有点超出我的深度.但它似乎不适用于我至少尝试复制您的数据集:

mysql> select col2 from foo where col2 not in
(select col1 from foo);
Empty set (0.02 sec)
Run Code Online (Sandbox Code Playgroud)

如果我从子查询中排除5个NULL,它可以工作,这向我建议"NOT IN(NULL)"不一定按照人们认为它的工作方式工作:

mysql> select col2 from foo where col2 not in
(select col1 from foo where col1 is not null);
+-------+
| col2  |
+-------+
| 15001 |
| 15002 |
| 15003 |
| 15004 |
| 15005 |
+-------+
5 rows in set (0.02 sec)
Run Code Online (Sandbox Code Playgroud)

我在MySQL中避免子查询的主要原因是它们具有不可预测的性能特征,或者至少是复杂的,无法预测它们.有关更多信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/subquery-restrictions.html中的"O(MxN)"注释以及短网页http:// dev上的建议. mysql.com/doc/refman/5.5/en/rewriting-subqueries.html.