2013-02-24 65 views
2

我有3个字段的表如下删除所有B,A从表的MySQL

id a b 
1 1 2 
2 1 3 
3 2 1 
4 2 3 
5 3 1 
6 3 2 

(A,B)和(B,A)在此表中(A = 1和B两者存在= 2和a = 2和b = 1)。我需要从上表中删除所有(b,a)。

Output: 

id a b 
1 1 2 
2 1 3 
4 2 3 

我尝试了自加入这样

select v1.id, v2.id from val v1,val v2 where v1.a=v2.b and v1.b=v2.a 

,并发现了相应的IDS哪个比赛。但是,在这之后无法继续。请帮助。

回答

3

如果你想永久删除这些重复记录,这里是它使用MySQL的LEASTGREATEST内置功能DELETE声明。

DELETE a 
FROM tableName a 
     LEFT JOIN 
     (
      SELECT LEAST(a, b) aa, 
        GREATEST(a,b) bb, 
        MIN(ID) min_ID 
      FROM tableName 
      GROUP  BY aa, bb 
     ) b ON a.ID = b.min_ID 
WHERE b.min_ID IS NULL 

SELECT声明

SELECT * 
FROM tableName 
WHERE (LEAST(a, b),GREATEST(a,b), ID) 
     IN 
     (
      SELECT LEAST(a, b) aa, 
        GREATEST(a,b) bb, 
        MIN(ID) min_ID 
      FROM tableName 
      GROUP BY aa, bb 
     ) 
+0

一个简单的版本:HTTP:// www.sqlfiddle.com/#!2/59cfa/5 – 2013-02-24 16:19:43

0

你可以这样做来选择你想要的输出。

select id, v1.a, v2.a from test v1 left join test v2 on (v1.id = v2.id and v1.a > v2.b) 
where v2.id is null 
0

如果你想只显示 “半” 结果:

SELECT * 
FROM val 
WHERE a <= b ; 

,如果你想删除的另一半:

DELETE * 
FROM val 
WHERE a > b ; 
相关问题