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)