Jak usunąć z select w MySQL?
Ten kod nie działa dla MySQL 5.0, jak go przepisać 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 przez większość czasu jego tylko jeden identyfikator (próbowałem w składni i to nie działa, jak również).
4 answers
SELECT
(sub) queries return result sets . Musisz więc użyć IN
, a nie =
w klauzuli WHERE
.
Dodatkowo, jak pokazano w ta odpowiedź nie można modyfikować tej samej tabeli z zapytania podrzędnego w tym samym zapytaniu. Jednak możesz albo SELECT
następnie DELETE
w osobnych zapytaniach, albo zagnieżdżać inne zapytanie podrzędne i nazywać wewnętrzny wynik zapytania podrzędnego (wygląda raczej chwiejnie):
DELETE FROM posts WHERE id IN (
SELECT * FROM (
SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
) AS p
)
Lub użyć łączników zgodnie z sugestią Mchl.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:23
DELETE
p1
FROM posts AS p1
CROSS JOIN (
SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-30 13:12:33
Możesz użyć połączenia 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 16:43:13
Jeśli chcesz usunąć wszystkie duplikaty, ale jeden z każdego zestawu duplikatów, jest to 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;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 14:02:33