Allegro75
@Allegro75
SummaryTables.ru - сайт с футбольной статистикой

GROUP BY запрещён в DELETE-запросе?

Пытаюсь удалить из таблицы записи-дубликаты.
У них совпадающее с некоторой другой записью значение в колонке order_id, но свой уникальный id - так я их (записи-дубликаты) распознаю.
Пишу запрос такого вида:
DELETE 
FROM cl_purchases
WHERE point IN ( 600258 )
AND date LIKE '2020-03-%'
AND order_type = 'delivery'
GROUP BY order_id
HAVING COUNT( id ) > 1
AND provider <> 'iikodelivery'

База исполнять отказывается, пишет ошибку:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY order_id HAVING COUNT( id ) > 1 AND provider <> 'iikodelivery'' at line 6


Зато берёт в работу запрос вот такого неуклюжего вида:
DELETE 
FROM cl_purchases
WHERE id IN
(
    SELECT `non`.id
    FROM 
    (
        SELECT *
        FROM cl_purchases
        WHERE point IN ( 600258 )
        AND date LIKE '2020-03-%'
        AND order_type = 'delivery'
        GROUP BY order_id
        HAVING COUNT( id ) > 1
        AND provider <> 'iikodelivery'
    ) AS `non`
)

Там, правда, возникает новая ошибка (
#1205 - Lock wait timeout exceeded; try restarting transaction
), но это, как я понимаю, уже другая проблема.

Вопросы:
- правильно ли я понимаю, что конструкция GROUP BY запрещена для непосредственного использования в WHERE-условии при DELETE-запросе?
- если да, то где про это почитать?
- нормально ли я обошёл проблему в своём запросе или надо как-то элегантнее?
  • Вопрос задан
  • 114 просмотров
Решения вопроса 2
Да, GROUP BY нет в конструкции DELETE. И да, это вполне корректный вариант, ничего в нем неуклюжего нет.
Из документации:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

Ответ написан
Комментировать
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
Ответы:
- Да, Вы не можете использовать GROUP BY вместе с DELETE кроме как в подзапросе.
- Почитать в документации MySQL
- оптимизация Вашего запрса:
DELETE 
FROM cl_purchases
WHERE id IN (
        SELECT id
        FROM cl_purchases
        WHERE point = 600258 
            AND date BETWEEN '2020-03-01 00:00:00' AND '2020-03-31  23:59:59'
            AND order_type = 'delivery'
            AND provider <> 'iikodelivery'
        GROUP BY order_id
        HAVING COUNT( id ) > 1
)


Перед удалением рекщмендую проверить что под-запрос возвращает нужный результат
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы