我正在寻找一种简单的方法来从另一个表中减去表中存在的值。某种"减去" 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行。
谢谢
答案 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