【问题标题】:MySQL UPDATE if some conditions meet (or Create PROCEDURE)如果某些条件满足,则 MySQL UPDATE(或创建 PROCEDURE)
【发布时间】:2015-04-24 05:26:24
【问题描述】:

我只想在某些条件满足的情况下进行 mysql 更新。

我表中的列是 fname、mname、lname(First、Middle、Last Name)。

例如数据,

    fname mname lname
 1   RONALD DAVID VALE
 2   RONALD D VALE
 3   RONALD  VALE
 4   JACK A SMITH
 5   JACK B SMITH
 6   JACK  SMITH
 7  MICHAEL JAMES ADAMS
 8  MICHAEL JOHN ADAMS
 9  MICHAEL J ADAMS
 10  MICHAEL ADAMS

如果姓和名相等,那么我检查中间名的第一个字母。然后我想在我们的例子中将中间名更新为“DAVID”,因为我们想让他们成为同一个人。但是,如果有两个不同的中间名,例如 row 4, 5,那么我们希望保持原样,因为我们认为三个 JACK SMITH 是不同的人。

此外,如果有两个不同的中间名以相同的字母开头,我们不会更新名称。例如,7,8,9,10 行保持不变。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    如果我理解正确,您正在寻找有多个记录的名字/姓氏对,并且这些记录中只有一个中间首字母。

    以下更新应处理此问题:

    update table t join
           (select lname, fname, max(mname) as mname
            from table t2
            having count(*) > 1 and min(mname) = max(mname)
           ) t2
           on t.lname = t2.lname and t.fname = t2.fname
        set t.mname = t2.mname
        where t.mname is null;
    

    【讨论】:

      【解决方案2】:
      UPDATE tablename t JOIN
        ( SELECT fname, mname, min(mname) minname, max(mname) mxname, lname, count(*) as qty
          FROM tablename 
          GROUP BY fname, lname
          HAVING qty > 1
      ) sub
      ON t.fname = sub.fname AND t.lname = sub.lname
      SET t.mname = IF(sub.qty = 2, sub.mxname, IF(sub.qty > 2 AND minname = mxname, sub.mxname,  NULL))
      WHERE t.mname is NULL
      

      这是一个可能的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-09
        • 2014-09-26
        相关资源
        最近更新 更多