0

我有一些类别,其中有一些行数..

在某些类别中包含非常少的行,在某些其他类别中包含大约 5000 行..

我需要的是: 在一个类别中,仅当该类别中的行数超过 500 行时,才应删除一些随机行.. 总体而言,每个类别中最多应有 500 行.. 应删除重复行(无论它们有多少)回覆..)

我不明白如何在 mysql 中编写查询,有人可以帮我解决这个问题吗?

编辑: 我的桌子现在是这样的..

**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

考虑以下...

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 回答
0

我希望这对你有足够的帮助。

DELETE FROM TABLENAME 

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

ORDER BY RAND() 

LIMIT 10

限制 10 是您想要的删除次数。

于 2013-10-18T11:31:01.130 回答
-1

你好,

据我了解,您有一个 CategoryDe​​tails 表,其中每个 CategoryID 有多个记录。并且您需要为每个 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 回答