检查相邻列中相同条目的行

时间:2014-01-29 16:15:18

标签: mysql sql select

我需要一个select命令来执行以下操作:

我有一张这样的表

ID | col1 | col2 | ...
23 | AAA  |  BBB | ...
23 | BBB  |  AAA | ...
59 | asf  |  567 | ...
02 | XXX  |  ZZZ | ...
02 | YYY  |  XXX | ...

有时会有2行具有相同的ID。现在我想选择这些,它们在两个特定列(此处为col1,col2)中也具有相同的直径相邻条目,就像示例中的前两行一样。通过类比,这些具有相同的ID但不同的条目(见最后两行)。

作为示例的结果,我想要有两个表:

ID | col1 | col2 | ...
23 | AAA  |  BBB | ...
23 | BBB  |  AAA | ...

ID | col1 | col2 | ...
02 | XXX  |  ZZZ | ...
02 | YYY  |  XXX | ...

我尝试使用GROUP BY计算但是失败了

2 个答案:

答案 0 :(得分:1)

SELECT t0.*
  FROM test t0
  JOIN test t1 ON ((t0.ID=t1.ID) AND
                   (t0.col1=t1.col2 AND t0.col2=t1.col1));

+----+------+------+
| ID | col1 | col2 |
+----+------+------+
| 23 | BBB  | AAA  |
| 23 | AAA  | BBB  |
+----+------+------+

SELECT t0.*
  FROM test t0
  JOIN test t1 ON (NOT (t0.col1=t1.col1 AND t0.col2=t1.col2) AND 
                   (t0.ID=t1.ID) AND 
                   (t0.col1<>t1.col2 OR t0.col2<>t1.col1));
+----+------+------+
| ID | col1 | col2 |
+----+------+------+
|  2 | YYY  | XXX  |
|  2 | XXX  | ZZZ  |
+----+------+------+

答案 1 :(得分:0)

你需要的是你的桌子的自我加入,使用做三件事的标准:

  1. 匹配ID号
  2. 包含您想要的col1 / col2邻居加入
  3. 排除各行的连接。
  4. 此查询执行此操作。

    SELECT a.id, a.col1, a.col2
      FROM tbl AS a
      JOIN tbl AS b ON 
          (     a.id=b.id
            AND (a.col1 =  b.col2 OR  a.col2 = b.col1)
            AND (a.col1 != b.col1 AND a.col2 != b.col2)
          )
    

    这是一个小提琴。 http://sqlfiddle.com/#!2/3cd08/2/0