2015-07-21 122 views
1

我有一张表,我需要添加一个增量列,但增量应基于其他列中的现有值进行。基于其他列值的唯一性增加列值

select * from mytable; 

first_col second_col 
    A    B 
    A    C 
    A    D 
    A    E 
    A    B 
    A    D 

现在,我想补充另一列说NEW_COLUMN其值唯一的first_col和second_col的基础上递增。

一栏应填写这样的:

first_col second_col new_col 
    A    B   1 
    A    C   1 
    A    D   1 
    A    E   1 
    A    B   2 
    A    D   2 
    A    B   3 

是否有可能做到这一点使用内置自动递增策略某种的的MySQL。

回答

0

没有内置在MySQL的增量法,但你可与相关子查询或变量做到这一点:

select t.*, 
     (@rn := if(@c = concat(first_col, ':', second_col), @rn + 1, 
        @c := concat(first_col, ':', second_col), 1, 1 
       ) 
     ) as new_col 
from mytable t cross join 
    (select @rn := 0, @c := '') params 
order by first_col, second_col; 

注:此重新排序的结果。如果你想以原始顺序得到结果,那么你需要一个指定排序的列。

0

下面介绍如何做到这一点,用要插入的值替换col1valcol2val

INSERT INTO mytable (first_col, second_col, new_col) 
VALUES (SELECT col1val, col2val SUM(COUNT(*), 1) 
     FROM mytable 
     GROUP BY first_col, second_col 
     HAVING first_col = col1val AND second_col = col2val) 

请注意,这是一个插入查询,只会影响新插入的值。

+0

这将更新新列仅包括一个再寄一次的值要我可能会保持持续的新行和新列自动提取值。 – LearningToDesign

1

使用临时表与auto_incremented ID列,你可以做

create temporary table tt (
    id int auto_increment primary key, 
    col1 varchar(32),col2 varchar(32)); 

insert into tt 
select col1, col2 from origtable; 

select col1, col2, 
    (select count(*)+1 from tt s 
    where s.col1=m.col1 and s.col2=m.col2 
    and s.id<m.id) n 
frm tt m 
+0

谢谢。这似乎是一个更标准的方法。只有这样,我不会让序列生成器表不是临时的。 – LearningToDesign