2014-03-05 38 views
0

消除重复值选择所有重复记录我的表名图MYSQL由另一列

栏目有:wwid_a,wwid_b,活跃,DATE_ADDED

值是

 
+--------+--------+--------+---------------------+ 
| wwid_a | wwid_b | active |  date_added  | 
+--------+--------+--------+---------------------+ 
| 1943 | 402158 |  1 | 2014-03-05 09:08:51 | 
| 1943 | 402209 |  1 | 2014-03-05 09:08:52 | 
| 1943 | 402464 |  1 | 2014-03-05 09:08:52 | 
| 402158 | 1943 |  1 | 2014-03-05 09:08:5 | 
| 402209 | 1943 |  1 | 2014-03-05 09:08:59 | 
| 402464 | 1943 |  1 | 2014-03-05 09:08:58 | 
+--------+--------+--------+---------------------+ 

基本上每个条目具有由wwid_a和wwid_b互换列的重复记录。

我想选择查询,这将使每个唯一的记录通过交替wwid_a和wwid_b消除重复值

 
+--------+--------+--------+---------------------+ 
| wwid_a | wwid_b | active |  date_added  | 
+--------+--------+--------+---------------------+ 
| 1943 | 402158 |  1 | 2014-03-05 09:08:51 | 
| 1943 | 402209 |  1 | 2014-03-05 09:08:52 | 
| 1943 | 402464 |  1 | 2014-03-05 09:08:52 | 
+--------+--------+--------+---------------------+ 
+0

该表确实具有以下数据记录 – kayra

回答

2

事实上,如果一切都是相同的,那么这可能是最有效的地清除它们:如果您担心

select g.* 
from graph g 
where g.wwid_a < g.wwid_b; 

这可能不是总是是真的,那么你有几个选择。该not exists逻辑可能是最好的:

select g.* 
from graph g 
where g.wwid_a < g.wwid_b or 
     not exists (select 1 
        from graph g2 
        where g2.wwid_a = g.wwid_b and 
         g2.wwid_b = g.wwid_a 
       ); 

也就是说,保持连续,如果第一个记录是小于第二个。或者,如果匹配的小于记录不存在,则保留它。

这对于在graph(wwid_a, wwid_b)上索引较大的数据效果最好。

+0

@Alnitak。 。 。 OP不仅说这是真的,但我甚至在第一句中重复了这种情况。 –

+0

表格确实有如下数据+ -------- + -------- + -------- + -------------- ------- + | wwid_a | wwid_b |活动| date_added | + -------- + -------- + -------- + --------------------- + | 1943 | alvarar3 | 1 | 2014-03-05 09:08:51 | | alvarar3 | 1943 | 1 | 2014-03-05 09:08:52 | + -------- + -------- + -------- + -------------------- - + – kayra

+0

它的工作原理...谢谢 – kayra