更新具有重复值的行(在相同列中)

And*_*ois 3 mysql sql

我想更新我的表,以便共享值(在相同列中)的行被标记为这样.

示例表定义:

CREATE TABLE `MyTable` (
  `id`  int NOT NULL ,
  `a`  varchar(10) NOT NULL ,
  `b`  varchar(10) NOT NULL , 
  `state`  tinyint NOT NULL , 
  PRIMARY KEY (`id`) 
) ;
Run Code Online (Sandbox Code Playgroud)

我想更新在同一列中共享值的每一行的"状态".因此,如果第一行具有"a = AAAA"而第二行具有相同的"a"值,则两者都应该更新.

我试过这个,但它太慢了(不比使用JDBC在Java中做得快):

declare mycursor cursor for select id, a, b from mytable;
open mycursor;
repeat
   fetch mycursor into idid, aa, bb;
   update mytable set state=1 where (a=aa, b=bb)
until done end repeat;
close mycursor;
Run Code Online (Sandbox Code Playgroud)

有什么想法让这种方式变得更好?多年来我没有做过任何体面的SQL.

Dev*_*art 7

尝试第一次查询以查看具有重复项的行 -

SELECT * FROM MyTable t1
  JOIN (
    SELECT a, b FROM MyTable
      WHERE a = 'aa' AND b = 'bb' -- additional condition
      GROUP BY a, b
      HAVING COUNT(*) > 1) t2
  ON t1.a = t2.a AND t1.b = t2.b
Run Code Online (Sandbox Code Playgroud)

试试这个(基于第一个查询)来更新status字段 -

UPDATE MyTable t1
JOIN (
  SELECT a, b FROM MyTable
  WHERE a = 'aa' AND b = 'bb' -- additional condition
  GROUP BY a, b
  HAVING COUNT(*) > 1) t2
ON t1.a = t2.a AND t1.b = t2.b
SET t1.state = 1;
Run Code Online (Sandbox Code Playgroud)