因此,我有一个查询,可以给我一个很好的项目列表。我想使用不同的参数再次运行查询,以获取第二个项目列表。
然后我要比较两个列表。我想查看第二个查询中的项目,而不是第一个查询中的项目。
我也想做同样的事情,但要找到常见的物品。
我本质上想运行UNIX comm命令,并且我一直在分别运行查询,然后执行此操作。但是我想使过程自动化。
我该怎么做?我意识到这是一个初学者的问题,但我什至不知道从哪里开始。
SELECT DISTINCT A0
from shakedata2
WHERE PLAY_ID=489 OR PLAY_ID=490
GROUP BY A0;
所以我想运行两个查询,输出一个查询中的项目,而不输出另一个,或者在其他情况下,输出两个查询中相同的项目。
答案 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 EXISTS
或LEFT 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
。