madmax04101
Goto Top

Doppelte Einträge löschen mit alten Datum im mysql

Hallo!

Ich werde gerne in meiner Daten doppelte Einträge löschen. Dabei sollen nur die älteren gelöscht werden.

Ich haben ihnen eine Spalte eine Nummer (artikel) z.b 2312 und in einer anderen das Datum( preis_anfrage_vom) z.b 2018-01-07.

Jetzt würde ich gerne alle Nummer (Artikel) die gleich sind löschen bis auf den einen mit dem höchsten Datum.


Hier ein Beispiel

Nummer Datum
2312 2018-01-07
2312 2017-02-03

Da sollte nur die 2312 2017-02-03 gelöscht werden.

Ich hoffe da kann mir wer helfen.

Content-Key: 360605

Url: https://administrator.de/contentid/360605

Printed on: April 23, 2024 at 13:04 o'clock

Member: em-pie
em-pie Jan 10, 2018 at 20:42:43 (UTC)
Goto Top
Moin,

Mal so logisch gedacht, ohne jetzt die Syntax zusammenzubauen:

Arbeite mal dem max() bzw. min() Statement:

Baue dir eine "virtuelle" Tabelle, welche die Artikel und das min(date) beinhaltet.
Anschließend baust du (zum Test) eine weitere Tabelle alá Select * from Table where in (erste virtuelle Tabelle)
https://www.w3schools.com/sql/sql_in.asp

Du musst nur mal schauen, wie das läuft, wenn du quasi zwei Values benötigst. Du musst ja prüfen, ob Artikel und Datum in der virt. Tabelle "Artikel, moin ( Datum)" enthalten ist.

Gruß
em-pie
Member: madmax04101
madmax04101 Jan 10, 2018 at 21:01:29 (UTC)
Goto Top
Hallo!

Vielen dank für die Antwort.

Leider verstehe ich nicht ganz was du meinst.
Member: ukulele-7
ukulele-7 Jan 11, 2018 at 07:21:41 (UTC)
Goto Top
DELETE
FROM tabelle
WHERE EXISTS (

SELECT 1
FROM tabelle t1
WHERE t1.Nummer = tabelle.Nummer
AND t1.Datum > tabelle.Datum

)
Also in MSSQL würde das funktionieren (wie auch andere Varianten). In MySQL bin ich mir nicht sicher, ich glaube da kommt eine Meldung die man noch umgehen muss. Teste es mal (und bitte nicht an Echtdaten).
Member: Volchy
Volchy Jan 11, 2018 at 08:06:55 (UTC)
Goto Top
Moin,

da es keine row_number() Funktion als solches gibt, kannst du dir sowas stricken:

set @row_number = 0;
set @art_number = 0;

select @row_number:=case
	when @art_number = nummer then @row_number +1
	else 1
	end as nummerblock,
	@art_number:=nummer as num,
	nummer,
	datum
from tabelle
where nummer is not null
order by datum desc, nummer

Du erhälst dann eine Auflistung mit einer Spalte Nummerblock. 1 sollte demnach den neusten Artikeln (wegen der Sortierung) entsprechen und alles was größer 1 ist zum Löschen nachher sein.

LG