我必须从状态为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
答案 0 :(得分:2)
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.
我希望这可以帮助你或其他人寻找这个,因为我认为这很常见。