从sql查询中排除相同的对

时间:2017-04-12 13:34:31

标签: mysql sql

我有一个包含两列的表:

primId   column1   column2
1         98        62
2         62        98
3         3         105
4         105       3
5         11        4

我需要获得第二行,第四行,第五行。 如果98,62出现一次,则62,98不能出现(如果可能,我需要最新值)。 我从这个链接Removing Mirrored Pairs from SQL Join获得了帮助,但没有运气。 这些值在较大或较小程度上彼此无关。 请告诉我如何才能得到这个结果。 这可能与Sql查询。 感谢

4 个答案:

答案 0 :(得分:3)

你可以这样做:

select  t1.*
from    yourTable t1
left join
        yourTable t2
on      t1.column1 = t2.column2 and
        t1.column2 = t2.column1
where   t2.column1 is null or
        t1.column1 > t1.column2

镜像行将被连接,由于第二个where条件,您将只接受它们一次,并且未镜像的行将不会被连接,因此您将使用第一个{ {1}}条件。

修改

要让最后一对夫妇返回,您可以使用此方法

where

内部查询将为每对夫妇返回最高select t1.* from yourTable t1 join ( select max(primId) as primId, case when column1 > column2 then column2 else column1 end c1, case when column1 < column2 then column2 else column1 end c2 from yourTable group by case when column1 > column2 then column2 else column1 end, case when column1 < column2 then column2 else column1 end ) t2 on t1.primId = t2.primId ,无论顺序如何。将它与源表连接起来,就可以将其用作过滤器。

您可以看到它有效here

答案 1 :(得分:0)

您可以使用以下查询:

SELECT DISTINCT LEAST(column1, column2) AS column1,
                GREATEST(column1, column2) AS column2
FROM mytable

注意:如果字段顺序与您无关,则上述查询有效。否则你必须使用JOIN之类的@Stefano建议。

答案 2 :(得分:0)

如果表中存在查询结果集中的行并不重要,则可以使用leastgreatest,以便每对检索一行。

select distinct least(column1,column2) as col1, greatest(column1,column2) as col2 
from tablename

如果检索到的行 出现在表格中,请使用上一个查询并将其加入现有表格。

select t.column1,t.column2
from tablename t
left join (select least(column1,column2) as col1, greatest(column1,column2) as col2 
           from tablename
           group by least(column1,column2), greatest(column1,column2)
           having count(*)>1
          ) x on x.col1=t.column1 and x.col2=t.column2
where x.col1 is null and x.col2 is null

答案 3 :(得分:0)

如果您想确保保留原始对(因此不允许4,1作为输出),那么以下内容应该非常有效:

select t.*
from t
where t.column1 <= t.column2
union all
select t.*
from t
where t.column1 > t.column2 and
      not exists (select 1 from t t2 where t2.column1 = t.column2 and t2.column2 = t.column1);

为获得最佳性能,您需要t(column1, column2)上的索引。