it-swarm.com.de

Wie lösche ich aus select in MySQL?

Dieser Code funktioniert nicht für MySQL 5.0. Schreiben Sie ihn neu, damit er funktioniert

DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id  HAVING ( COUNT(id) > 1 ))

Ich möchte Spalten löschen, die keine eindeutige ID haben. Ich werde hinzufügen, dass die meiste Zeit seine einzige ID ist (ich habe die In-Syntax ausprobiert und es funktioniert auch nicht).

74
IAdapter

SELECT (Unter-) Abfragen geben Ergebnismengen zurück . Sie müssen also IN verwenden, nicht = in Ihrer WHERE -Klausel.

Darüber hinaus können Sie, wie in diese Antwort gezeigt, nicht dieselbe Tabelle aus einer Unterabfrage in derselben Abfrage ändern. Sie können jedoch entweder SELECT und dann DELETE in separaten Abfragen verschachteln oder eine andere Unterabfrage verschachteln und das Ergebnis der inneren Unterabfrage als Alias ​​angeben (sieht jedoch etwas kitschig aus):

DELETE FROM posts WHERE id IN (
    SELECT * FROM (
        SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
    ) AS p
)

Oder benutze joins wie von Mchl vorgeschlagen .

182
BoltClock
DELETE 
  p1
  FROM posts AS p1 
CROSS JOIN (
  SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)
20
Mchl

sie können Inner Join verwenden:

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
Elegant Odoo

Wenn Sie alle Duplikate löschen möchten, jedoch nur eines von jedem Duplikatsatz, ist dies eine Lösung:

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;
0
havvg