【问题标题】:MySQL: How do i update 50% of the rows, randomly selected?MySQL:我如何更新随机选择的 50% 的行?
【发布时间】:2012-06-20 16:06:49
【问题描述】:

我想更新随机选择的表中 50% 的行。有什么办法吗?

编辑:只是为了澄清它应该始终更新 50% 的记录,但是在这 50% 的记录中,必须随机选择行(例如,不仅是前 50%)。换句话说,平均而言,每隔一条记录都应该更新。

【问题讨论】:

    标签: mysql random percentage


    【解决方案1】:

    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 子句更改带有更新语法的查询来更新记录

    【讨论】:

      【解决方案2】:

      应该这样工作:

      UPDATE table SET x = y WHERE RAND() < 0.5
      

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

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

      规范摘录(重点是我的):

      一般规则

      1) &lt;search condition&gt; 应用于 T 的每一行。结果 &lt;where clause&gt; 是 T 的那些行的表 &lt;search condition&gt; 的结果为真。

      2)&lt;search condition&gt;中的每一个&lt;subquery&gt;对T的每一行都有效执行,结果在应用程序中使用 的&lt;search condition&gt; 到 T 的给定行。如果有任何执行 &lt;subquery&gt; 包含对 T 列的外部引用,然后 引用是给定行中该列的值 T.

      【讨论】:

      • 这肯定会更新 all 行一半的时间,而另一半则根本不更新?
      • 还有另一个问题:即使它按计划工作,它也可能不会更新任何行 - 或更新所有行。 RAND() 是随机的,你知道的。 )
      • 如果这行得通,它只适用于 MySql(我知道,这是 OP 正在使用的) - 绝对只有 UPDATEs 在 MSSql 上是全有或全无。
      • 嗯,还是正确的。您写道“换句话说,平均而言,应该更新所有其他记录。”。这就是这里所做的,平均:)。如果您想要 50%,请使用 raina77ow 的答案。但是,他的解决方案的性能对于大表可能不太好(并且由于大数定律,我的条件应该越接近 50% 表越大)。
      • @Widor:在规范中查找,在我的回答中引用。我提到的行为是正确的。如果 Mssql 将此查询编译为全有或全无执行,则 Mssql 没有正确实现标准(不会是第一个不关心标准的 MS 产品,参见 IE 和 W3C 标准...)
      【解决方案3】:

      更新表 SET volumnvalue = x WHERE RAND()

      【讨论】:

        【解决方案4】:

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

        $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);
        

        【讨论】:

        • 你可以用一个查询来表达。然后你就可以使用标准 SQL 并且没有奇怪的伪代码扩展。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2011-09-26
        相关资源
        最近更新 更多