我有一个名为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,则应该更新它。
答案 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和不同状态的行来实现此结果。
答案 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