Этот код не работает для MySQL 5.0, как его переписать, чтобы он работал
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
Я хочу удалить столбцы, у которых нет уникального идентификатора. Я добавлю, что в большинстве случаев это только один идентификатор (я пробовал синтаксис in, и он тоже не работает).
SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
DELETE p1 FROM posts AS p1 CROSS JOIN ( SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1 ) AS p2 USING (id)
источник
CROSS JOIN
по-видимому, выполняет декартово соединение, поэтому кажется, что это может сделать ненужную работу или выполнить неоптимально? Кто-нибудь может объяснить?USING
предложения. СUSING
продуктом ограничено парами , имеющими одинаковое значение вid
столбце, так что это на самом деле очень ограничены.DELETE p1 FROM posts AS p1 INNER JOIN ( SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1 ) AS p2 ON p2.ID=p1.ID
вы можете использовать внутреннее соединение:
DELETE ps FROM posts ps INNER JOIN (SELECT distinct id FROM posts GROUP BY id HAVING COUNT(id) > 1 ) dubids on dubids.id = ps.id
источник
Если вы хотите удалить все дубликаты, но по одному из каждого набора дубликатов, это одно из решений:
DELETE posts FROM posts LEFT JOIN ( SELECT id FROM posts GROUP BY id HAVING COUNT(id) = 1 UNION SELECT id FROM posts GROUP BY id HAVING COUNT(id) != 1 ) AS duplicate USING (id) WHERE duplicate.id IS NULL;
источник