Удалить таблицу MySQL с помощью итератора - PullRequest
0 голосов
/ 03 ноября 2011

Можно ли удалить в цикле while, например, итерацию?
ex:

значение идентификатора
1 12
1 13 - следует удалить
1 14 - следует удалить
2 15,3
2 43 - следует удалить
2 22 - следует удалить

Теперь мне нужно удалить каждые 2-ю и 3-ю (i% 2 == 0 || i% 3 == 0) строки.

Ответы [ 2 ]

1 голос
/ 03 ноября 2011
mysql> select * from t;
+------+-------+
| id   | value |
+------+-------+
|    1 |    12 |
|    1 |    13 |
|    1 |    14 |
|    2 |    15 |
|    2 |    43 |
|    2 |    22 |
+------+-------+
6 rows in set (0.00 sec)

mysql> set @c = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> delete t
    -> from t join (
    ->   select t.*, mod(@c := @c + 1, 3) c
    ->   from t
    ->   order by id, value
    ->   ) t1
    -> on t1.id = t.id
    -> and t1.value = t.value
    -> and t1.c != 1;
Query OK, 4 rows affected (0.05 sec)

mysql> select * from t;
+------+-------+
| id   | value |
+------+-------+
|    1 |    12 |
|    2 |    15 |
+------+-------+
2 rows in set (0.00 sec)

Если это не 3, 4, но вам нужен один на группу:

mysql> select * from t;
+------+-------+
| id   | value |
+------+-------+
|    1 |    12 |
|    1 |    13 |
|    1 |    14 |
|    2 |    15 |
|    2 |    43 |
|    2 |    22 |
+------+-------+
6 rows in set (0.00 sec)

mysql> delete t
    -> from t
    -> left join (
    ->   select * from t
    ->   group by id
    ->   ) t1
    -> on t1.id = t.id
    -> and t1.value = t.value
    -> where t1.id is null;
Query OK, 4 rows affected (0.07 sec)

mysql> select * from t;
+------+-------+
| id   | value |
+------+-------+
|    1 |    12 |
|    2 |    15 |
+------+-------+
2 rows in set (0.00 sec)
1 голос
/ 03 ноября 2011

Попробуйте сделать это после создания резервной копии:

DROP TABLE IF EXISTS temptt;
CREATE TEMPORARY TABLE temptt (`id` INT, `value` INT);
INSERT INTO temptt 
    SELECT * FROM your_table GROUP BY id;
DELETE t1.* 
FROM your_table t1 LEFT JOIN temptt t2
    ON t1.id = t2.id AND t1.value = t2.value
WHERE t2.id IS NULL;

Идея состоит в том, чтобы вставить данные, которые не следует удалять во временную таблицу, а затем удалить все данные из вашей_таблицы, которых нет в этой таблице.

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