Ten kod nie działa z MySQL 5.0, jak go ponownie napisać, aby działał
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
Chcę usunąć kolumny, które nie mają unikalnego identyfikatora. Dodam, że przeważnie jest to jedyny identyfikator (próbowałem w składni i też nie działa).
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)
źródło
CROSS JOIN
najwyraźniej wykonuje sprzężenie kartezjańskie, więc wygląda na to, że może to wykonać niepotrzebną pracę lub działać nieoptymalnie? Czy ktoś mógłby to wyjaśnić?USING
klauzuli. ZUSING
iloczynem ogranicza się do par o tej samej wartości wid
kolumnie, więc w rzeczywistości jest bardzo ograniczony.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
możesz użyć sprzężenia wewnętrznego:
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
źródło
Jeśli chcesz usunąć wszystkie duplikaty, ale po jednym z każdego zestawu duplikatów, oto jedno rozwiązanie:
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;
źródło