Supponiamo che la tavola è stato nominato test
e conteneva alle colonne denominate id
e data
.
si comincia con una SELECT che ci dà l'id di tutte le righe che hanno una riga precedente (più alto id di tutti gli ID inferiore id del nostro riga corrente):
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)
che ci dà l'ids 3 e 6. Le loro precedenti righe 2 e 5 contengono %X%
, quindi va bene.
Ora consente di ottenere gli ID delle righe che contengono %X%
e combinarle con quelle precedenti, via l'unione:
(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%'
)
che ci dà 3, 6, 2, 5 - bello!
Ora, non è possibile eliminare da una tabella e selezionare dalla stessa tabella in MySQL - quindi utilizzare una tabella temporanea, archiviare i nostri id che devono essere eliminati e quindi leggere da quella tabella temporanea per eliminare dal nostro tavolo originale:
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);
... e ci ritroviamo con gli iD 1, 4 e 7 nella nostra tabella test
!
(E poiché le righe precedenti sono selezionate utilizzando <, ORDER BY e LIMIT, funziona anche se gli ID non sono continui.)
@Aiias: Questa è una domanda completamente diversa. – duskwuff