Mysql帮助更新具有相同值的行

时间:2012-11-29 10:47:54

标签: mysql sql

我有一个名为status_t的表:

**id** **page** **status** **locked**_by
  1      0        2          0
  1      1        2          0
  1      2        2          0
  2      0        0          0
  2      1        2          0
  2      2        2          0

主键是(id,page)。

在上面的示例中,我想更新所有内容 所有页面的行具有status = 2。

即。查询应将id = 1的所有行更新为状态3.因此表格将变为

**id** **page** **status** **locked**_by
  1      0        3          1
  1      1        3          1
  1      2        3          1
  2      0        0          0
  2      1        2          0
  2      2        2          0

我试过了:

SELECT * FROM  status_t AS t
 WHERE id IN   
 (SELECT id FROM status WHERE status = 0) LIMIT 10

上面的查询提取要更新的行,但我不能这样做:

UPDATE status_t as S1 WHERE id IN 
(SELECT id FROM status_t WHERE status = 2) 
SET S1.status = 3, S1.locked_by = 1

编辑:

上面的表只是一个例子。

我不想更新WHERE id = 1。我只想更新行,无论id 对于相同的id,status = 2。 在上面的示例中,如果带有键(2,2)的行具有status = 2,则应该更新它。

6 个答案:

答案 0 :(得分:1)

试试这个:

UPDATE status_t a 
INNER JOIN (SELECT id FROM status_t WHERE STATUS = 2 GROUP BY id HAVING COUNT(*) = 3 LIMIT 1) AS b ON a.id = b.id
SET a.status = 3, a.locked_by = 1;

这将根据您的需要更新所有页面状态= 2

的数据

答案 1 :(得分:1)

这应该有效:

update status_t t
join (
    select distinct id from status_t s
    where status=2 and not exists (
        select 1 from status_t ss
        where s.id=ss.id and s.status <> ss.status
    )
) i on i.id = t.id
set t.status = 3

内部查询选择ID status的所有值都设置为2的ID。它通过检查tere是否具有相同ID和不同状态的行来实现此结果。

这是demo on sqlfiddle

答案 2 :(得分:0)

以下应该可以解决问题:

UPDATE status_t 
SET status = 3, locked_by = 1 
WHERE status = 2

不应该使用子查询,因为WHERE应该能够直接在UPDATE语句中使用。

编辑:

我刚刚注意到你只对ID = 1的行进行了更新,这与{'在上面的例子中我想要更新所有页面状态= 2的所有行都不匹配。 {1}} id = 2 . The rows where status = 2`也会被我的查询更新。

如果您只需更新特定ID,请在我的查询结尾添加以下内容:

, and

答案 3 :(得分:0)

试试这个::

UPDATE status_t SET status = 3, locked_by = 1 WHERE status = 2

如果你想以自己的方式实现这一目标:

UPDATE 
status_t as S1 
INNER JOIN 
(
   SELECT keyword_id 
    FROM status_t WHERE status = 2
 ) as tempStatus ON id= tempStatus.keyword_id

SET S1.status = 3, S1.locked_by = 1

答案 4 :(得分:0)

试试这个

  update status_t set staus=3 ,locked_by=1 
  where id=1

 update status_t set status=3 ,locked_by=1 
  where status=2

答案 5 :(得分:0)

UPDATE status_t SET status = 3, S1.locked_by = 1 WHERE id = 1