2017-02-18 21 views
0

Ich brauche Hilfe und ich möchte wissen, wenn wie kann ich die nächste Zeile oder Spalte Werte, die die vorherige entspricht löschen Zeilen- oder Spaltenwerte in einer MySQL-Tabellenbasis aus 2 Spalten.Wie lösche ich die NEXT Zeile Werte, die die vorherigen Zeile Werte auf einer 2 Spalte in MySQL

Also, wenn die nächste Zeile/Spalte Werte/Ergebnis enthält die gleichen Werte für die vorherigen Zeilen/Spalten Werte/Ergebnis wird es gelöscht, aber wenn die nächste Spalte nicht mit beiden der vorherigen Spalte Werte/Ergebnis übereinstimmt , diese Zeile sollte nicht gelöscht werden. Was wird die richtige Abfrage für diese Bedingung sein?

Ich versuche, zuerst eine Auswahl-Abfrage zu machen, um die Daten zu überprüfen, und dies ist meine Abfrage für die Auswahl. Ist meine Abfrage richtig für die Auswahl?

SELECT current_row.row, current_row.id, current_row.column1, 
     current_row.column2, previous_row.row, previous_row.id, 
     previous_row.column1, previous_row.column2 
FROM 
    (SELECT @rownum:[email protected]+1 row, a.*  
    FROM MyTable a, (SELECT @rownum:=0) r 
    ORDER BY unix_time, id 
    ) as current_row 

LEFT JOIN 
    (SELECT @rownum2:[email protected]+1 row, a.*  
    FROM MyTable a, (SELECT @rownum2:=0) r 
    ORDER BY unix_time, id) as previous_row 

ON (current_row.id = previous_row.id) 
AND (current_row.column1 = previous_row.column1) 
AND (current_row.column2 = previous_row.column2) 
AND (current_row.row = previous_row.row - 1) 
LIMIT 10; 

Vielen Dank im Voraus für jede Hilfe!

Prost!

+0

Gibt es ein Loch und 'id's in 'mytable' gelöscht? Würden Sie versuchen, diese Abfrage immer wieder zu verwenden? – MohaMad

+0

@MohaMad - Ja, im Grunde muss diese Abfrage in einem Cron-Job oder grundsätzlich in einer Bash ausgeführt werden. Aber ich muss wirklich wissen, wie ich diese Löschung grundsätzlich machen kann. –

+0

@MohaMad - Und übrigens, keine gelöschte ID ab dem Moment. –

Antwort

0

Wir versuchen, select Daten mit zugeordneten neuen virtuellen id zum Vergleich, so ON Klausel sollte t1.myid=t2.myid+1 und WHERE Klausel filtert col1 und col2 Reihen sein sollte:

SET @id1:=0 , @id2:=0 ; 
SELECT * FROM (
     (SELECT *, @id1:[email protected]+1 as myid from mytable) as t1 
LEFT JOIN 
     (SELECT *, @id2:[email protected]+1 as myid from mytable) as t2 
ON t1.myid = t2.myid + 1 
) 
WHERE t1.col1= t2.col1 and t1.col2 = t2.col2 

Und für DELETE Befehl, sollten Sie speichern Ergebnisse in temporäre Tabelle und dann löschen Zeilen, in denen ihre ID in der Tabelle gespeichert ist:

SET @id1:=0 , @id2:=0 ; 
CREATE TEMPORARY TABLE tbl_ids AS 
SELECT t1.id FROM (-- t1.id returns NEXT row 
     (SELECT *, @id1:[email protected]+1 as myid from mytable) as t1 
LEFT JOIN 
     (SELECT *, @id2:[email protected]+1 as myid from mytable) as t2 
ON t1.myid = t2.myid + 1 -- t1.myid > t2.myid 
) 
WHERE t1.col1= t2.col1 and t1.col2 = t2.col2 ; 

DELETE FROM mytable WHERE id in (SELECT * FROM tbl_ids) ; 
+0

lassen Sie mich versuchen, wenn das funktioniert, also wo kann ich die Löschung übrigens haben? –

+0

Sie möchten die vorherige oder nächste Zeile löschen? @DatabaseAdmin – MohaMad

+0

Wenn die nächste Zeile/Spalte Werte/Ergebnis dieselben Werte für die vorherigen Zeilen/Spalten enthält, sollten die nächsten Werte/Ergebnisse gelöscht werden, aber wenn die nächste Spalte nicht mit den beiden vorherigen Spaltenwerten/Ergebnis übereinstimmt, das sollte nicht gelöscht werden. –

Verwandte Themen