2015-09-26 55 views
1

我正在寻找一种简单的方法,从另一个表中减去表中存在的值。对于MySQL如何在mysq中从table1中减去table2?

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次,并且在第二,这意味着在输出3行2次。 B在第一个表中发生3次,第二次发生1次,因此结果为2行。

谢谢

回答

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这样的查询来得到结果。

0

以下查询将为您提供所需的输出。在这里,我们算的Id S中的数和从table1选择过程中,维持一个计数从table2只显示counted数量的项目:

SELECT 
    id 
FROM 
    (SELECT 
     *, 
      IF(@prevvalue <> id, @counter:=0, @counter), 
      IF(@counter < counter, @counter:[email protected] + 1, NULL) shouldshow, 
      @prevvalue:=id 
    FROM 
     (SELECT 
     table1.*, table2.id t2id, table2.counter 
    FROM 
     table1 
    JOIN (SELECT 
     COUNT(id) counter, id 
    FROM 
     table2 
    GROUP BY id) table2 ON (table1.id = table2.id) 
    ORDER BY table1.id) table1, (SELECT @counter:=0, @prevvalue:=NULL) countertable) table1 
WHERE 
    shouldshow IS NULL 
ORDER BY id; 
相关问题