Mariadb: mysql Ver 15.1 Distrib 10.3.8-MariaDB
У меня есть таблица, построенная как объединение запросов из нескольких других таблиц. Эта таблица выглядит примерно так
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| source_id | int(11) | YES | | NULL | |
| code | varchar(64) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
Поле кода может содержать "лишнюю" информацию в фигурных скобках {думать о них как о комментариях}. Я хочу найти все строки, где поле кода равно, если комментарии игнорируются, а затем оставить только одну строку из каждой дублирующейся группы.
Это бит "держать один ряд в каждой группе", который вызывает у меня проблемы.
У меня есть запрос, в котором будут перечислены идентификаторы всех строк в каждой группе
select id
from mytable
group by (regexp_replace(code, '(?-i){.*?}', ''))
having count(*) > 1
но если я сделаю это подзапросом в операции DELETE WHERE, он удалит все дубликаты. Не то, что я хочу.
После поиска функции «все, кроме одного» или "вытолкнуть одного из списка вывода" я наткнулся на версию LIMIT с двумя аргументами и OFFSET-
select id
from mytable
group by (regexp_replace(code, '(?-i){.*?}', ''))
having count(*) > 1 limit 1000000 offset 1
но если вы поместите это в команду DELETE, это не удастся
delete from mytable where id in(
select id
from mytable
group by (regexp_replace(code, '(?-i){.*?}', ''))
having count(*) > 1 limit 1000 offset 1
);
ERROR 1235 (42000): This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Есть идеи как этого добиться? Предпочтительно на месте, но в худшем случае я мог бы ВЫБРАТЬ во временную таблицу, а затем заменить оригинал, если это то, что нужно.