2009-12-14 11 views
7

Ich habe eine Tabelle mit zwei Feldern sesskey (varchar32, index) und products (int11), jetzt muss ich alle Zeilen löschen, die Gruppe nach sesskey count (*) = 1. Ich versuche ein paar Methoden, aber alles scheitert.MYSQL Lösche alle Ergebnisse mit count (*) = 1

Beispiel:

delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1) 

Das sesskey Feld keinen Primärschlüssel, weil sein wiederholt werden könnte. Dank Kommentar unten @Quassnoi ... Der Wille oben NICHT Arbeit in MySql, wie MySql die Tabelle referenzieren beschränkt:

Antwort

9
DELETE si 
FROM t_session si 
JOIN (
     SELECT sesskey 
     FROM t_session so 
     GROUP BY 
       sesskey 
     HAVING COUNT(*) = 1 
     ) q 
ON  q.sesskey = si.sesskey 

Sie müssen hier Mitglied werden. Die Verwendung einer korrelierten Unterabfrage funktioniert nicht. Weitere Einzelheiten

diesen Artikel in meinem Blog sehen:

+0

aus irgendeinem Grund funktionierte das nicht für mich in einer aktuellen MySQL-Version. Ich musste das Beispiel aus Ihrem Blog verwenden (LINKER JOIN, ID IS NULL). Ich habe es geschafft, auch die falschen Zeilen zu löschen: p (musste für meinen Fall IS NOT NULL verwenden) – Spikolynn

1

Die SubQuery sollte

Delete from taged 
    Where sesskey in 
    (Select sesskey 
     From taged 
     Group by sesskey 
     Having count(*) = 1) 

EDIT arbeiten in einer Unterabfrage aktualisiert oder gelöscht werden, müssen Sie dasselbe mit einem Join ... tun.

+0

Funktioniert nicht (15 Zeichen) – Quassnoi

+0

# 1093 - Sie können keine Zieltabelle 'benachteiligten' angeben, für Update in FROM-Klausel – Alex

+0

Dieser Fehler ist verwirrend ... Es gibt kein "Update" hier weiter ... Worauf bezieht es sich? Die Verwendung des Tabellennamens in der Delet-Klausel? oder die Verwendung des Tabellennamens in der Unterabfrage (die weder aktualisiert noch gelöscht wird) –

1

Oder wenn Sie ein verwenden älter (vor 4.1) Version von MySQL und haben keinen Zugriff auf Unterabfragen müssen Sie Ihre Daten in einer Tabelle auswählen, verbinden dann die Tabelle mit dem Original:

CREATE TABLE delete_me_table (sesskey varchar32, cur_total int); 

INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table 
WHERE cur_total = 1 GROUP BY sesskey; 

DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey); 

Jetzt haben Sie eine Tabelle über delete_me_table namens links enthält eine Historie aller gelöschten Zeilen. Sie können dies für die Archivierung, Trends, andere lustige und ungewöhnliche Dinge verwenden, um sich zu überraschen.