Załóżmy, że stół został nazwany test
i zawierał kolumn wymienionych id
i data
.
Zaczynamy SELECT, który daje nam id wszystkich wierszy, które mają poprzedni rząd (najwyższy id wszystkich identyfikatorów niższy niż id naszego bieżącego wiersza):
SELECT t1.id FROM test t1
JOIN test t2 ON
(t2.id, true)
=
(SELECT t3.id, t3.data LIKE '%X%' FROM test t3
WHERE t3.id < t1.id ORDER BY id DESC LIMIT 1)
To daje nam identyfikatory 3 i 6. Ich poprzednie wiersze 2 i 5 zawierają %X%
, więc to dobrze.
Teraz przejdźmy identyfikatory wierszy, które zawierają %X%
i połączyć je z poprzednimi, poprzez UNII:
(SELECT t1.id FROM test t1
JOIN test t2 ON
(t2.id, true)
=
(SELECT t3.id, t3.data LIKE '%X%' FROM test t3
WHERE t3.id < t1.id ORDER BY id DESC LIMIT 1)
)
UNION
(
SELECT id FROM test WHERE data LIKE '%X%'
)
To daje nam 3, 6, 2, 5 - nice!
Teraz nie możemy usunąć z tabeli i wybrać z tej samej tabeli w MySQL - więc użyjmy tabeli tymczasowej, przechowuj nasze identyfikatory, które mają zostać usunięte, a następnie odczytaj z tej tabeli tymczasowej, aby usunąć od naszej pierwotnej tabeli:
CREATE TEMPORARY TABLE deleteids (id INT);
INSERT INTO deleteids
(SELECT t1.id FROM test t1
JOIN test t2 ON
(t2.id, true)
=
(SELECT t3.id, t3.data LIKE '%X%' FROM test t3
WHERE t3.id < t1.id ORDER BY id DESC LIMIT 1)
)
UNION
(
SELECT id FROM test WHERE data LIKE '%X%'
);
DELETE FROM test WHERE id in (SELECT * FROM deleteids);
... i jesteśmy w lewo z identyfikatorami 1, 4 i 7 w naszej test
stole!
(A ponieważ poprzednie wiersze są wybierane przy użyciu <, ORDER BY i LIMIT, działa to również, jeśli identyfikatory nie są ciągłe.)
@Aasas: To zupełnie inne pytanie. – duskwuff