0

いくつかの行があるいくつかのカテゴリがあります..

一部のカテゴリでは行数が非常に少なく、他のカテゴリでは約 5000 行が含まれています。

私が必要としているのは: カテゴリでは、そのカテゴリに 500 行を超える場合にのみ、いくつかのランダムな行を削除する必要があります..各カテゴリ全体で最大 500 行が存在する必要があります..リマイニング行は削除されます (それらの数に関係なく)再..)

mysqlでクエリを書く方法を理解していません.誰かplsがこれについて私を助けてくれます..?

編集済み: 私のテーブルは現在このようになっています..

**CATEGORIES|NO OF ROWS**
========================
CAT1|500
CAT2|5000
CAT3|20
CAT4|50
CAT5|4000

NO OF ROWS : そのそれぞれのカテゴリからのすべての行のカウント!

現在、CAT2 と CAT5 は 500 行を超えているため、残りの行はこれら 2 つのカテゴリから削除する必要があります.. (注:どの行が削除されるかは気にしません。ランダムに削除できます..)

4

3 に答える 3

0

これで十分に役立つことを願っています。

DELETE FROM TABLENAME 

WHERE (SELECT COUNT(*) FROM TABLENAME > 500)

ORDER BY RAND() 

LIMIT 10

制限 10 は、必要な削除の数です。

于 2013-10-18T11:31:01.130 に答える
0

次のことを検討してください...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table (category_id INT NOT NULL,val INT NOT NULL,PRIMARY KEY(category_id,val));

INSERT INTO my_table VALUES (1,101),(1,102),(1,103),(1,104),(2,103),(2,104),(2,105),(3,104),(3,105),(4,106);

SELECT * FROM my_table;
+-------------+-----+
| category_id | val |
+-------------+-----+
|           1 | 101 |
|           1 | 102 |
|           1 | 103 |
|           1 | 104 |
|           2 | 103 |
|           2 | 104 |
|           2 | 105 |
|           3 | 104 |
|           3 | 105 |
|           4 | 106 |
+-------------+-----+

SELECT x.*
     , COUNT(*) rank 
  FROM my_table x 
  JOIN my_table y 
    ON y.category_id = x.category_id 
   AND RAND(y.val) <= RAND(x.val) 
 GROUP 
    BY x.category_id
     , x.val
 ORDER BY category_id
     , rank;
+-------------+-----+------+
| category_id | val | rank |
+-------------+-----+------+
|           1 | 104 |    1 |
|           1 | 101 |    2 |
|           1 | 102 |    3 |
|           1 | 103 |    4 |
|           2 | 104 |    1 |
|           2 | 105 |    2 |
|           2 | 103 |    3 |
|           3 | 104 |    1 |
|           3 | 105 |    2 |
|           4 | 106 |    1 |
+-------------+-----+------+

したがって、「2」より上位にランク付けされたすべての行を考慮したい場合、このクエリは次のように書き直すことができます...

 SELECT x.*
   FROM my_table x 
   JOIN my_table y 
     ON y.category_id = x.category_id 
    AND RAND(y.val) <= RAND(x.val) 
  GROUP 
     BY x.category_id
      , x.val
 HAVING COUNT(*)> 2;

...その後、JOIN の単純なエージェンシーによって DELETE に置き換えることができます

 DELETE a FROM my_table a
   JOIN 
      ( SELECT x.*
          FROM my_table x 
          JOIN my_table y 
            ON y.category_id = x.category_id 
           AND RAND(y.val) <= RAND(x.val) 
         GROUP 
            BY x.category_id
             , x.val
        HAVING COUNT(*)> 2
      ) b 
     ON b.category_id = a.category_id
    AND b.val = a.val;

 Query OK, 3 rows affected (0.08 sec)

 SELECT * FROM my_table;
 +-------------+-----+
 | category_id | val |
 +-------------+-----+
 |           1 | 101 |
 |           1 | 104 |
 |           2 | 104 |
 |           2 | 105 |
 |           3 | 104 |
 |           3 | 105 |
 |           4 | 106 |
 +-------------+-----+
 7 rows in set (0.00 sec)
于 2013-10-18T11:47:37.943 に答える
-1

やあ、

私の理解では、CategoryID ごとに複数のレコードを持つ CategoryDe​​tails TABLE が 1 つあります。そして、CategoryID ごとに最大 500 レコードを維持する必要があります。

上記の理解に従って、SQL CTEを使用して以下のソリューションを提供しています。私が間違っている場合は、クエリを詳細に説明してください。

WITH cteCategoryDetails AS (
SELECT ROW_NUMBER() OVER (PARTITION BY CategoryID, STATE ORDER BY CategoryID) AS RowNum  FROM CategoryDetails
) DELETE FROM cteCategoryDetails WHERE RowNum > 500

ありがとう、ヴィシャル・パテル

于 2013-10-18T11:40:47.990 に答える