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ż).

Author: IAdapter, 2010-12-30

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.

 161
Author: BoltClock,
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)
 20
Author: 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
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  
 3
Author: Cherif,
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;
 -1
Author: havvg,
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