ランダムに選択されたテーブルの行の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 の各行に適用されます。 の結果は、結果が真<where clause>
である T の行のテーブルです。<search condition>
2)
<subquery>
内の各は、<search condition>
T の各行に対して効果的に実行され、結果は 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);
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 volumnvalue = x WHERE RAND() <= 0.5 の場合、レコードの 50% 近くになります。