Doppelte Datensätze Löschen
Kopp
- datenbank
Hallo,
Möchte, wenn möglich, mit nur einem DELETE befehl doppelte oder gar x-Fache Mysql-Datensätze löschen bzw. eben nur die überflüssigen Einträge.
[PSEUDO SQL]
DELETE UNIQUE name,str FROM tbl
[/PSEUDO SQL]
wobei $name und $str die Selects darstellen soll wonach eben gesucht werden soll, so dass $name und $str die Eindeutigen Spalten sind... ich glaube man versteht mich, oder?
Kopp
echo $begrüßung;
ich glaube man versteht mich, oder?
Die Frage ist nur, was du an den zahlreichen Archiv-Threads zu dem Thema nicht verstanden hast, so dass man dir nun gezielt bei diesem Verständnisproblem helfen kann.
echo "$verabschiedung $name";
Die halfen mir eben nicht weiter!
DISTINCT macht eigentlich genau das was ich will bis auf die tatsache das ich als Ergebnis auch nur die Spalte erhalte die ich eindeutig selektiert habe. Ich möchte jedoch eindeutig selektieren und alle spalten aufgelistet haben quasi
SELECT DISTINCT firma
SHOW ALL
:-)
yo,
Ich möchte jedoch eindeutig selektieren und alle spalten aufgelistet haben
verräst du uns auch noch den aufbau deiner tabelle mit beispieldaten, welche in der tabelle sind und welche du davon als "überflüssig" bezeichnen würdest ?
Ilja
yo,
»» Ich möchte jedoch eindeutig selektieren und alle spalten aufgelistet haben
verräst du uns auch noch den aufbau deiner tabelle mit beispieldaten, welche in der tabelle sind und welche du davon als "überflüssig" bezeichnen würdest ?
ähm... okay: :-)
id|firma|str|plz |ort |tel
1 |abc |1 |egal|egal|egal
2 |abc |1 |egal|egal|egal
3 |xyz |1 |egal|egal|egal
4 |xyz |2 |egal|egal|egal
Die Abfrage soll dazu führen, dass die tabelle so aussieht
1 |abc |1 |egal|egal|egal
3 |xyz |1 |egal|egal|egal
4 |xyz |2 |egal|egal|egal
Aber das sollte ja mit der Replace Technik gehen.. mal sehen..
Kopp
yo,
Aber das sollte ja mit der Replace Technik gehen.. mal sehen..
mit folgender abfrage bekommst du die gewünschte menge:
SELECT t1.*
FROM tabelle t1
WHERE t1.id IN (SELECT MIN(t2.id)
FROM tabelle t2
GROUP BY t2.firma, t2.str
)
;
Ilja
Moin,
mit folgender abfrage bekommst du die gewünschte menge:
SELECT t1.*
FROM tabelle t1
WHERE t1.id IN (SELECT MIN(t2.id)
FROM tabelle t2
GROUP BY t2.firma, t2.str
)
;
Bin doch ein wenig verwirrt bei der Abfrage.
Könntest du diese kurz erläutern?
Brauche ich dazu 2 Identische Tabellen? Oder eine Leere und eine Volle Datenbank? Was davon ist t1 und was t2? "tabelle t1" = "t1" also
SELECT t1.*
FROM t1
WHERE t1.id IN (SELECT MIN(t2.id)
FROM t2
GROUP BY t2.firma, t2.str
)
;
oder?
Also bevor ich einfach irgendwas mach, frag ich doch lieber noch ma kurz nach :-)
Kopp
yo,
Brauche ich dazu 2 Identische Tabellen? Oder eine Leere und eine Volle Datenbank? Was davon ist t1 und was t2? "tabelle t1" = "t1"
du brauchst dafür nur die orginal-tabelle, t1 und t2 sind alias-namen weil in der abfrage die tabelle zweimal vor kommt und man sie unterscheiden muss.alles was du tun musst, ist meine abfrage nehmen und für den namen "tabelle" den richtigen namen deiner tabelle eintragen und die aliasbezeichnungen mit t1 nud t2 so belassen.
Ilja
Tolle Abfrage...
Hat mein Rechner zu 100% Ausgelastet für mehrere Minuten, bis ich ihn neu gestartet habe..
Die Replace-Technik war da 10 mal effektiver.
Außerdem zu was soll Deine Abfrage führen, da es ja nur ein SELECT ist?
Kopp
yo,
Außerdem zu was soll Deine Abfrage führen, da es ja nur ein SELECT ist?
sie zeigt dir die betroffenen datensätze an. ist eine vorgehensweise, die ich bei veränderungen oder löschungen bevorzuge, so dass man sich vorher noch mal einen überblick verschaffen kann. daraus ein entsprechendes delete zu machen ist sehr einfach.
Ilja
Moin,
Du kannst auch folgendermaßen vorgehen:
dann hast Du in "B" die um Duplikate bereinigten Daten.
Viele Grüße
Stefan
yo,
- eine neue Tabelle "B" anlegen (Kopie von "A" aber nur Struktur)
- einen oder mehrere UNIQUE Indizes in "B" anlegen
- dann ein REPLACE INTO B SELECT * FROM A
unwahrscheinlich, weil es innerhalb einer tabelle noch einen pk wert gibt, den man meistens behalten will.
Ilja