我想更新随机选择的表中 50% 的行。有没有办法做到这一点?
编辑:只是为了澄清它应该始终更新 50% 的记录,但在这 50% 中,必须随机选择行(例如,不仅是前 50%)。换句话说,平均而言,应该更新所有其他记录。
我想更新随机选择的表中 50% 的行。有没有办法做到这一点?
编辑:只是为了澄清它应该始终更新 50% 的记录,但在这 50% 中,必须随机选择行(例如,不仅是前 50%)。换句话说,平均而言,应该更新所有其他记录。
应该这样工作:
UPDATE table SET x = y WHERE RAND() < 0.5
是的,测试过,有效。但当然,平均只有 50% 的行,而不是 50%。
正如 SQL 92 规范中所写的,WHERE
必须为每个元组执行该子句,因此rand()
必须重新评估以产生预期的结果(而不是选择所有行或根本不选择行)。
规范摘录(强调我的):
一般规则
1)
<search condition>
应用于 T 的每一行。 的结果是 T 的结果为真的<where clause>
那些 T 行的表。<search condition>
2)对 T 的每一
<subquery>
行<search condition>
有效地执行其中的每个,并将结果应用于T<search condition>
的给定行。如果任何执行<subquery>
包含对 T 的列的外部引用,则引用是对的值T 的给定行中的该列。
正如我所说,这是一段很长的路,用一种伪代码来描述。)
$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);
UPDATE table SET volumnvalue = x WHERE RAND() <= 0.5 将导致非常接近 50% 的记录
RAND
应该是随机的,你不会得到一个固定的百分位分割。
最好使用模运算符%
来查找每 X 个项目。这对于像主键这样的唯一 id 列最有效。
尝试运行此查询,请务必指定您的表名和 id 列名:
选择每第二行,可被 2 整除
SELECT * from <your_table_name> where <id_column_name> %2=0
选择每 6 行,可被 6 整除
SELECT * from <your_table_name> where <id_column_name> %6=0
一旦您对SELECT
结果看起来不错感到满意,您可以使用更新语法更改查询以更新记录,使用相同的WHERE
子句