MySQL:我如何更新50%的行,随机选择?

Jam*_*mes 15 mysql random percentage

我想更新表中随机选择的50%的行.有没有办法做到这一点?

编辑:只是为了澄清它应该总是更新50%的记录,但是在那些50%的行中必须随机选择(例如,不仅仅是前50%).换句话说,在avarage中,每个其他记录都应该更新.

gex*_*ide 30

应该这样工作:

UPDATE table SET x = y WHERE RAND() < 0.5
Run Code Online (Sandbox Code Playgroud)

是的,经过测试,有效.但当然,它平均只有50%的行,而不是50%.

正如SQL 92规范中所写,WHERE必须为每个元组执行该子句,因此rand()必须重新评估该子句以产生预期结果(而不是根本选择所有行或不选择任何行).

摘自规范(强调我的):

通用规则

1)<search condition>应用于T的每一行.结果<where clause>是T的那些行的表,其结果<search condition>为真.

2)每个<subquery>中的每一个<search condition> 都有效地执行T的每一行和结果用于T<search condition>的给定行的应用.如果任何执行 <subquery>包含对T列的外部引用,那么引用的值是T中给定行中的那一列

  • 还有另一个问题:即使它按计划运行,它也可能不会更新任何行 - 或更新所有行.你知道,兰德()是随机的.) (2认同)
  • 不,为每个元组计算where子句. (2认同)

rai*_*7ow 7

正如我所说,这是一个很长的路,用一种伪代码描述.)

$x = SELECT COUNT(*) FROM some_table;
@ids = SELECT id FROM some_table ORDER BY RAND() LIMIT $x / 2;
UPDATE some_table WHERE id IN (@ids);
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过一个查询来表达这一点。然后您就可以使用标准 SQL,而无需奇怪的伪代码扩展。 (2认同)