【发布时间】:2012-06-20 16:06:49
【问题描述】:
我想更新随机选择的表中 50% 的行。有什么办法吗?
编辑:只是为了澄清它应该始终更新 50% 的记录,但是在这 50% 的记录中,必须随机选择行(例如,不仅是前 50%)。换句话说,平均而言,每隔一条记录都应该更新。
【问题讨论】:
标签: mysql random percentage
我想更新随机选择的表中 50% 的行。有什么办法吗?
编辑:只是为了澄清它应该始终更新 50% 的记录,但是在这 50% 的记录中,必须随机选择行(例如,不仅是前 50%)。换句话说,平均而言,每隔一条记录都应该更新。
【问题讨论】:
标签: mysql random percentage
RAND 应该是随机的,您不会得到固定的百分位数。
最好使用模运算符% 来查找每X 个项目。这对于像主键这样的唯一 id 列最有效。
尝试运行此查询,请务必指定您的表名和 id 列名:
选择每 2 行,可被 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 子句更改带有更新语法的查询来更新记录
【讨论】:
应该这样工作:
UPDATE table SET x = y WHERE RAND() < 0.5
是的,经过测试,有效。但当然,平均只有 50% 的行,而不是 50%。
如 SQL 92 规范中所写,必须为每个元组执行 WHERE 子句,因此必须重新评估 rand() 以产生预期的结果(而不是选择所有行或根本不选择行)。
规范摘录(重点是我的):
一般规则
1)
<search condition>应用于 T 的每一行。结果<where clause>是 T 的那些行的表<search condition>的结果为真。2)
<search condition>中的每一个<subquery>对T的每一行都有效执行,结果在应用程序中使用 的<search condition>到 T 的给定行。如果有任何执行<subquery>包含对 T 列的外部引用,然后 引用是给定行中该列的值 T.
【讨论】:
UPDATEs 在 MSSql 上是全有或全无。
更新表 SET volumnvalue = x WHERE RAND()
【讨论】:
正如我所说,这是一段很长的路,用一种伪代码来描述。 )
$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);
【讨论】: