Как я могу удалить записи, которые соответствуют условию, оставляя 50? - PullRequest
4 голосов
/ 22 ноября 2011

Рассмотрим следующую таблицу:

CREATE TABLE `prize` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `prize_details_id` bigint(20) NOT NULL,
  `status` tinyint(4) DEFAULT '0',
  `available_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `prize_details_id_idx` (`prize_details_id`),
  KEY `status_idx` (`status`),
  KEY `available_at_idx` (`available_at`),
  CONSTRAINT `prize_prize_details_id_prize_detail_id` FOREIGN KEY (`prize_details_id`) REFERENCES `prize_detail` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1611419 DEFAULT CHARSET=latin1;

Что я хотел бы сделать, это удалить n записей, где n - это общее количество записей, соответствующих условию меньше 20. Таблица достаточно большая (больше 1 м записей).

Это сложное условие, которое включает запрос относительной даты для часто изменяющихся данных и также включает объединение пары других таблиц, поэтому сначала выберите, сколько из них соответствует условию, а затем удалите двадцать меньше насколько я знаю, буду работать.

Условием является все следующее:

  • prize_details_id - это x (необходимо выполнить один и тот же запрос для нескольких разных идентификаторов)
  • available_at равно нулю
  • prize_id не существует в другой таблице
  • status is 1
  • tier (в таблице prize_detail) выше y

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Может быть так:

  • создать временную таблицу _tmp (id int auto_increment, pri_id int)
  • выбрать соответствующие идентификаторы призов в эту временную таблицу
  • удалитьот выигрыша, где id (выберите приз_id из _tmp, где id> = 20)
1 голос
/ 23 ноября 2011

Возможный намек:

mysql>
mysql> CREATE TABLE test (
    ->   id SMALLINT unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO test () VALUES
    ->   (),(),(),(),(),(),(),(),(),(),
    ->   (),(),(),(),(),(),(),(),(),(),
    ->   (),(),(),(),(),(),(),(),(),();
Query OK, 30 rows affected (0.01 sec)
Records: 30  Duplicates: 0  Warnings: 0

mysql> DELETE FROM t USING
    -> test t JOIN (
    ->     SELECT id
    ->     FROM (
    ->         SELECT id
    ->         FROM test
    ->         ORDER BY id DESC
    ->         LIMIT 20, 1000
    ->     ) as ids) as ids ON t.id = ids.id;
Query OK, 10 rows affected (0.01 sec)

mysql> SELECT * FROM test;
+----+
| id |
+----+
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
| 21 |
| 22 |
| 23 |
| 24 |
| 25 |
| 26 |
| 27 |
| 28 |
| 29 |
| 30 |
+----+
20 rows in set (0.00 sec)
0 голосов
/ 22 ноября 2011
DELETE FROM prize
WHERE 
   id IN(--Some query--) AND
   id NOT IN(SELECT id FROM --Some query-- ORDER BY --some column-- LIMIT 20 )

Где порядок по идентифицирует «последние» 20 строк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...