2012-04-28 6 views
6

行の10%を削除したいとします。これを行うクエリがありますか?私は単に、フィルタ行の合計金額を返すPHPによって計算し、私のDELETEクエリでの限界とその値を使用します総計のパーセンテージでDELETE

DELETE FROM tbl WHERE conditions LIMIT (SELECT COUNT(*) FROM tbl WHERE conditions) * 0.1 

答えて

3

:よう

何か。あなただけ順不同で、行のおよそ 10%が必要な場合は

DELETE FROM ( SELECT h2.id 
       FROM ( SELECT COUNT(*) AS total 
         FROM tbl 
         WHERE conditions) AS h 
       JOIN ( SELECT *, @rownum := @rownum + 1 AS rownum 
         FROM tbl, (SELECT @rownum := 0) AS vars 
         WHERE conditions) AS h2 
       ON '1' 
       WHERE rownum < total * 0.1) AS h3 
+0

私はこれを行うことができることを知っています:D – dynamic

+0

おそらく本当にfarfetced、おそらくクエリを上回るでしょうか? :) –

+0

私は古い素敵なPHPの方法でstichします – dynamic

4

、これが何をすべき:DELETEは、このような、これは一つとして、高度なクエリを許可する場合

$query = mysql_query("SELECT COUNT(*) FROM tbl WHERE conditions"); 
$int = reset(mysql_fetch_array($query)); 
$int = round($int * 0.1); 

mysql_query("DELETE FROM tbl WHERE conditions LIMIT {$int}"); 

は私はわかりませんトリック:

しかし、乱数を生成するオーバーヘッドのために非常に大きなデータセットで使用することはお勧めしません。

+0

しかし、一方、より多くの行は、10%近くになる可能性があります。 –

+0

小さな行セットの場合、それほど正確ではありません。私は約100行以上のものはうまくいくはずだと思います。 – Polynomial

+0

いいえ私はいくつかの条件といくつかを持っています。ORDER BY – dynamic