MySQL で主キーではないカラムでユニーク化する方法のメモ。
以下のテーブルで主キーではない id でユニーク化します。
以下では主キーの key1、key2、key3 を \t で連結し、文字列的に最小の値となるレコードでユニーク化します。
■実行結果
以下のテーブルで主キーではない id でユニーク化します。
create table test1 ( id varchar(16) not null, key1 varchar(16) not null, key2 varchar(16) not null, key3 varchar(16) not null, data varchar(16) not null default '', primary key(key1, key2, key3), index(id) ); insert into test1 set id = 'prd_01', key1 = 'a', key2 = 'a', key3 = '01', data = 'a'; insert into test1 set id = 'prd_01', key1 = 'a', key2 = 'a', key3 = '02', data = 'a'; insert into test1 set id = 'prd_02', key1 = 'b', key2 = 'b', key3 = '01', data = 'b'; insert into test1 set id = 'prd_02', key1 = 'b', key2 = 'b', key3 = '02', data = 'b'; insert into test1 set id = 'prd_02', key1 = 'b', key2 = 'b', key3 = '03', data = 'b'; insert into test1 set id = 'prd_03', key1 = 'c', key2 = 'c', key3 = '01', data = 'c'; insert into test1 set id = 'prd_03', key1 = 'c', key2 = 'c', key3 = '02', data = 'c';
以下では主キーの key1、key2、key3 を \t で連結し、文字列的に最小の値となるレコードでユニーク化します。
select t1.id as id , t1.data as data from test1 t1 left join ( select id , min(concat(key1, '\t', key2, '\t', key3)) as k from test1 group by id ) tk on tk.k = concat(t1.key1, '_', t1.key2, '_', t1.key3) where tk.k is not null ;
■実行結果
id data prd_01 a prd_02 b prd_03 c