【问题标题】:How to subtract table2 from table1 in mysq?如何从mysql中的表1中减去表2?
【发布时间】:2025-12-14 20:50:01
【问题描述】:

我正在寻找一种简单的方法来从另一个表中减去一个表中存在的值。 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出现1次。

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

期望的输出是:

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

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

谢谢

【问题讨论】:

    标签: mysql subtraction


    【解决方案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)
    

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

    【讨论】:

      【解决方案2】:

      以下查询将为您提供所需的输出。在这里,我们计算Ids 的数量,并在从table1 中选择时,保持计数以仅显示counted 来自table2 的项目数:

      SELECT 
          id
      FROM
          (SELECT 
              *,
                  IF(@prevvalue <> id, @counter:=0, @counter),
                  IF(@counter < counter, @counter:=@counter + 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;
      

      【讨论】: