在組合中找到重複的資料

壹頁書發表於2015-09-01

                  挺有意思的一個需求.

實驗初始化一個表.

  1. CREATE TABLE `t` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `c1` int(11) DEFAULT NULL,
      `c2` int(11) DEFAULT NULL,
      `c3` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ;
    INSERT INTO `t` VALUES (1,1,2,3),(2,1,34,32),(3,23,42,2),(4,2,2,4),(5,2,3,3),(6,1,321,32),(7,,2,4),(8,1,2,99);
    


實驗要求找出c1,c2,c3三個欄位中,任意兩個欄位有重複的記錄.

第一種方式

  1. select t2.* from t t2 inner join (
        select 1 type,c1 v1 ,c2 v2,count(*) from t group by c1,c2 havingcount(*)>1
        union all 
        select 2,c2,c3,count(*) from t group by c2,c3 having count(*)>1
        union all
        select 3,c1,c3,count(*) from t group by c1,c3 having count(*)>1
    ) t1 on (
        case t1.type 
        when 1 then t1.v1=t2.c1 and t1.v2=t2.c2
        when 2 then t1.v1=t2.c2 and t1.v2=t2.c3
        when 3 then t1.v1=t2.c1 and t1.v2=t2.c3
        end
    );
    



第二種方式,需要用數字輔助表了
http://blog.itpub.net/29254281/viewspace-1362897/

  1. select * from t where id in (
        select substring_index(substring_index(idlist,',',nums.id),',',-1) fromnums,
        (
            select nid,v,group_concat(tid) idlist from (
                select t.id tid,nums.id nid,
                case nums.id 
                when 1 then concat(c1,',',c2)
                when 2 then concat(c2,',',c3)
                when 3 then concat(c1,',',c3) end v from nums,t where nums.id <=3  
            ) t1 group by nid,v having count(*)>1
        ) t2 where nums.id<=(length(idlist) - length(replace(idlist,',',''))+1)
    );
    



兩種方式貌似都可以.
                    


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1788751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章