首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用唯一值更新MySQL字段

使用唯一值更新MySQL字段
EN

Stack Overflow用户
提问于 2017-03-13 15:59:42
回答 1查看 389关注 0票数 0

我正在寻找一个mysql update查询,它将两个字段连接在一起,然后在唯一值仍然存在的情况下,为每个值添加一个增量,并更新第三个字段。如果连接的值是唯一的,它仍然应该在连接的基础上加1。

示例

代码语言:javascript
复制
Field1   Field2   UniqueValue
======   ======   ===========
A        B        AB1
A        A        AA1
A        A        AA2
A        A        AA3
C        D        CD1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-13 16:05:09

您可以使用用户变量为字段的每个唯一组合生成递增编号,然后将它们连接在一起。

代码语言:javascript
复制
select field1, field2, concat(field, rn) UniqueValue
from (
    select
        t.*,
        @rn := if(@field = field, @rn + 1, if(@field := field, 1, 1)) rn
    from
    (select
        field1, field2,
        concat(field1, field2) as field
    from your_table
    order by field
    ) t, (select @rn := 0, @field := null) t2
) t;

Demo

如果您想用生成的uniqueValue更新表-

如果您的表中有一个id列,您可以将您的表与上面关于该id的查询连接起来进行更新:

代码语言:javascript
复制
update your_table t1 join (
select id, concat(field, rn) UniqueValue
from (
    select
        t.id,
        field,
        @rn := if(@field = field, @rn + 1, if(@field := field, 1, 1)) rn
    from
    (select
        id, field1, field2,
        concat(field1, field2) as field
    from your_table
    order by field
    ) t, (select @rn := 0, @field := null) t2
) t
) t2 on t1.id = t2.id
set t1.uniqueValue = t2.UniqueValue;

Demo

如果您没有id列,那么解决这个问题的一种方法是使用一个新表来加载新值,然后将其重命名为原始表:

代码语言:javascript
复制
drop table if exists your_table;
drop table if exists your_table_new;
drop table if exists your_table_old;

CREATE TABLE your_table(
   Field1 VARCHAR(10) NOT NULL
  ,Field2 VARCHAR(10)
  ,UniqueValue Varchar(20)
);
INSERT INTO your_table(Field1,Field2) VALUES ('A','B');
INSERT INTO your_table(Field1,Field2) VALUES ('A','A');
INSERT INTO your_table(Field1,Field2) VALUES ('A','A');
INSERT INTO your_table(Field1,Field2) VALUES ('A','A');
INSERT INTO your_table(Field1,Field2) VALUES ('C','D');


create table your_table_new (field1 varchar(10), field2 varchar(10), uniquevalue varchar(20));

insert into your_table_new (field1, field2, uniqueValue)
select field1, field2, concat(field, rn) UniqueValue
from (
    select
        t.*,
        @rn := if(@field = field, @rn + 1, if(@field := field, 1, 1)) rn
    from
    (select
        field1, field2,
        concat(field1, field2) as field
    from your_table
    order by field
    ) t, (select @rn := 0, @field := null) t2
) t;

rename table your_table to your_table_old, your_table_new to your_table;

Demo

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42758811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档