【问题标题】:MySql update with different values a column for duplicate columnsMySql 使用不同的值更新重复列的列
【发布时间】:2017-03-08 08:08:18
【问题描述】:

我有一张这样的桌子

CREATE TABLE IF NOT EXISTS users_groups(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id INT(11) UNSIGNED NOT NULL,
  name VARCHAR(250) NOT NULL,
  is_deleted BOOLEAN NOT NULL DEFAULT false,
  creation_date DATETIME NOT NULL,
  last_modification_date DATETIME NOT NULL,
  PRIMARY KEY (id)
);

我想将列 (user_id, name) 设为唯一,但我遇到的问题是我已经在这些列中有重复项。在某些情况下,这些列会重复多次。

我想编写一个查询来更新连接名称中某些值的重复行,例如连接第一个重复的“*”第二个重复的“**”等等。

这样可以写查询吗?

我可以得到我想要修改的组,但我不确定是否可以用mysql实现我想要的

select users_groups.id, users_groups.user_id, users_groups.name
from users_groups
inner join (select user_id, name, count(*) from users_groups group by user_id, name having count(*) > 1) as u on u.user_id = users_groups.user_id
where users_groups.name = u.name;

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试这个。

    SET @prev_user_id := '';
    SET @prev_name := '';
    SET @cnt := 0;
    
    select s.id, s.user_id, s.name
    from 
    (
      select 
        users_groups.id,     
        IF(@prev_user_id <> users_groups.user_id OR @prev_name <> users_groups.name, @cnt := 0, @cnt := @cnt + 1) AS cnt,   
        CONCAT(users_groups.user_id, REPEAT('*', @cnt)) AS user_id,
        CONCAT(users_groups.name, REPEAT('*', @cnt)) AS name,  
        @prev_user_id := users_groups.user_id,
        @prev_name := users_groups.name
      from 
        users_groups
    ) s
    

    检查这里: http://sqlfiddle.com/#!9/6d553/10

    【讨论】:

    • 感谢您的回答。它不起作用,我不知道为什么,但它无法识别 select 语句中的变量@cnt
    • @agusgambina 抱歉,使用的文字有误,请重试。
    • 谢谢它的工作,我只需要在setselect之间添加update语句,并在末尾添加where子句。
    【解决方案2】:

    我不确定这是否有帮助,但您可以使列唯一,而不必是该表的主键。

    例如:

    CREATE TABLE user (
        user_id NOT NULL,
        firstname varchar(255) NOT NULL,
        UNIQUE (firstname)
    ) 
    

    或者下面的语句创建一个跨多个列的唯一约束。

    CREATE TABLE user (
        user_id NOT NULL,
        firstname varchar(255) NOT NULL,
        CONSTRAINT constraint_name UNIQUE (user_id, firstname)
    ) 
    

    另外,我不完全确定您为什么要识别重复项。完全避免重复记录和数据条目是一种很好的做法。这可以通过表规范化以及使用适当的索引来完成。

    我希望这在某种程度上有所帮助。

    【讨论】:

    • 我可能误解了你的问题。但是,最好完全避免重复。如果您使用正确的索引和键,那么您将永远不会有完全重复的行。您可能在一行中有与其他行重复的列,但您不会使用这些行来标识一条记录。
    • @Chris_Mulheron 谢谢你的回答。我完全同意你的看法,但这是已经发生的事情,我必须解决它。
    猜你喜欢
    • 2013-04-04
    • 2020-09-27
    • 2018-02-20
    • 2018-11-15
    • 2018-08-02
    • 2012-04-20
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多