Mysql使用单个查询更新选定的行

时间:2013-04-26 07:29:41

标签: php mysql

我必须从状态为book(id,book_id,status)的表status=0中选择3行。最初所有行都有status 0.所以通过使用select query.order by id和limit 3 I可以选择前3行。问题是如何将所选行状态更新为1,因为它们已被选中。

使用PHP,CodeIgniter和MySQL,我可以在一个查询中完成吗?

示例:

id  book_id  status 
1     100      0
2     101      0
3     102      0
4     103      0
5     104      0
6     105      0

选择前3行后,该行的状态应更新为1

id  book_id  status 
1     100      1
2     101      1
3     102      1
4     103      0
5     104      0
6     105      0

6 个答案:

答案 0 :(得分:2)

sqlfiddle demo

UPDATE t JOIN (select id from t where status = 0 
                    order by id limit 3) t1 USING (id)
SET status=1 ;

答案 1 :(得分:1)

我已经使用MySQL自己的RAND(N)函数解决了这个问题。

参考文献说:

  

如果指定整数参数N,则将其用作种子值

     

此行为的一个暗示相等的参数值,   每次RAND(N)返回相同的值,从而产生一个   可重复的列值序列

因此,我可以从表中选择一组随机记录,并使用相同种子,我可以更新完全相同的记录,而无需通过任何记录。

得到这样的东西:

SELECT id, book_id 
FROM book 
WHERE status = 0 
ORDER BY RAND({your_seed}) 
LIMIT 0, 3;

UPDATE book 
JOIN ( 
  SELECT id 
  FROM book 
  WHERE status = 0 
  ORDER BY RAND({same_seed}) 
  LIMIT 0, 3 
) temp USING (id) 
SET status = 1;

通过这种方式,您可以选择并更新完全相同的列表。

答案 2 :(得分:0)

是的,你可以。

UPDATE book
SET status = 1
WHERE id IN (
  SELECT id FROM book
  LIMIT 3
)

答案 3 :(得分:0)

我觉得这样的事情会这样做

UPDATE book SET status = 1 WHERE id IN (SELECT id FROM book ORDER BY id LIMIT 3)

答案 4 :(得分:0)

你可以做这样的事情

UPDATE TABLE NAME SET status = 1 WHERE id IN ( SELECT id FROM TABLE NAME  LIMIT 0,3)

希望这有帮助

答案 5 :(得分:0)

我不知道你是否解决了这个问题,但是我遇到了同样的问题,但我的不同之处在于我只想选择/更新1行。我使用这样的用户变量做到了:

SET @codigo:=NULL; -- the resulting value
UPDATE tproducto_codigos set canjeado=1, fecha_canjeo=NOW(), codigo=(@codigo:=codigo) 
 WHERE idtproducto_r=XXX AND canjeado=0 LIMIT 1; -- I only want the first row
SELECT @codigo as codigo; -- select the variable to get the value.

我希望这可以帮助你或其他人寻找这个,因为我认为这很常见。