我的表格不是太大了,所以我认为获得这样一个随机行的方法是可以接受的:
SELECT * FROM table ORDER BY RAND() LIMIT 1;
但是,我真正需要做的是在任何其他连接到达之前,在同一步骤中更新随机找到的行。这是我的尝试,无限期地运行,我必须杀死:
BEGIN;
SET @update_id := 0;
UPDATE jobs SET started = NOW(), id = (SELECT @update_id := id)
WHERE id = (SELECT jtemp.id FROM (SELECT * FROM jobs) as jtemp WHERE jtemp.started IS NULL ORDER BY RAND() LIMIT 1);
SELECT @update_id;
COMMIT;
@update_id
因为我需要将实际选择的行返回给客户端以供日后更新。
有更好的方法吗?我不认为随机行选择是这里的瓶颈,但我不确定。
答案 0 :(得分:-1)
这样的事情应该有效。
update yourtable
set field1 = value1
etc
where id =
(select id
from yourtable
order by rand()
limit 1)