如何从mysq中的table1中减去table2?

时间:2015-09-26 17:19:58

标签: mysql subtraction

我正在寻找一种简单的方法来从另一个表中减去表中存在的值。某种"减去" MySQl的运算符

http://www.techonthenet.com/sql/minus.php

通过代码删除它们(循环遍历第一个表,删除与第二个表匹配的行)将是我的最后选择,因为我已经简化了我的问题,但它要复杂得多。

请注意,复杂性在于重复的行。没有唯一的字段,必须保留每个重复的行。

示例:

给定一个带字母的表(按任何给定的顺序),A写5次,B 3次:

Table1
+--+
|ID|
+--+
|A | 
|A | 
|A | 
|B | 
|A | 
|B |
|B | 
|A | 
+--+

另一张字母相同,A出现2次,B出现一次。

Table2
+--+
|ID|
+--+
|A | 
|A | 
|B | 
+--+

所需的输出为:

+--+
|ID|
+--+
|A | 
|A | 
|A | 
|B | 
|B | 
+--+

A在第一个表中出现5次,在第二个表中出现2次,这意味着输出中有3行。 B在第一个表中出现3次,在第二个表中出现1次,因此,结果将是2行。

谢谢

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

select id from (
    select id,concat(id,
    case when id = @id then @rownum := @rownum+1 else @rownum:=1 end) as x,
    @id:=id
    from table1 inner join(select @rownum :=1,@id:='') n
) as t where x not in(
select x from(
    select concat(id,
    case when id = @id then @rownum := @rownum+1 else @rownum:=1 end) as x,
    @id:=id
    from table2 inner join(select @rownum :=1,@id:='') n2
) t2)

我们需要使用rownumbers使列唯一。由于mysql不支持rownum作为oracle,我们需要变量(@ rownum,@ id)来生成rownumber。然后table1应该是这样的:A1,A2,A3和table2。所以我们可以使用where id not in(id in table2等查询来获得结果。

答案 1 :(得分:0)

以下查询将为您提供所需的输出。在这里,我们会计算Id的数量,并在table1选择期间,维持一个只显示来自counted的{​​{1}}项数量的计数:

table2