如何比较选择唯一项目的两个结果?

时间:2019-04-24 23:07:17

标签: mysql

因此,我有一个查询,可以给我一个很好的项目列表。我想使用不同的参数再次运行查询,以获取第二个项目列表。

然后我要比较两个列表。我想查看第二个查询中的项目,而不是第一个查询中的项目。

我也想做同样的事情,但要找到常见的物品。

我本质上想运行UNIX comm命令,并且我一直在分别运行查询,然后执行此操作。但是我想使过程自动化。

我该怎么做?我意识到这是一个初学者的问题,但我什至不知道从哪里开始。

SELECT DISTINCT A0
from shakedata2
WHERE PLAY_ID=489 OR PLAY_ID=490
GROUP BY A0;

所以我想运行两个查询,输出一个查询中的项目,而不输出另一个,或者在其他情况下,输出两个查询中相同的项目。

2 个答案:

答案 0 :(得分:1)

要获取查询的常见项目,可以使用EXISTS

select q1.columnname from query1 q1
where exists (
  select 1 from query2 q2
  where q2.columnname = q1.columnname
)

INNER JOIN

select q1.columnname 
from query1 q1 inner join query2 q2
on q2.columnname = q1.columnname

要从query1中获得查询2中不存在的项目,请使用NOT EXISTSLEFT JOIN并仅获取没有query2对应值的行:

select q1.columnname 
from query1 q1 left join query2 q2
on q2.columnname = q1.columnname
where q2.columnname is null 

或使用NOT IN

select q1.columnname 
from query1 q1 
where q1.columnname not in (
  select q2.columnname 
  from query2 q2 
)

如果结果重复,您可以在所有上述查询的select语句中添加关键字distinct

答案 1 :(得分:1)

要查找一组不属于第二组的所有项,可以在mysql本身内使用外部联接:

perl -ane 'if($F[1]==2) {$n=<>;@k=split /\s+/,$n;@j=split /\s+/;s/$j[3]/$k[3]/;$n=~s/$k[3]/$j[3]/;print "$_$n" } else {s/\[.*\].+//;print}' d

select a.* from shakedata2 a left join shakedata2 b on a.play_id = b.play_id and (a.x1 = 1 and a.x2 = 2) and (b.y1 = 2 and b.y2 = 1) where b.play_id is null x1等是您可能要查询的示例字段。

要查找符合两个条件的记录,可以使用内部联接,也可以在上述查询中将x2更改为is null