テーブルに名前が付けられ、 および という名前の列test
に含まれているとします。id
data
前の行を持つすべての行の id (現在の行の id よりも小さいすべての id の最大の id) を提供する SELECT から始めます。
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 )
これにより、ID 3 と 6 が得られます。その前の行 2 と 5 には が含まれ%X%
ているので、これで問題ありません。
%X%
次に、UNION を使用して、それらを含む行の ID を取得し、前の行と結合します。
(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%'
)
これにより、3、6、2、5 が得られます。
ここで、テーブルから削除して MySQL の同じテーブルから選択することはできません。一時テーブルを使用して、削除する ID をそこに保存し、その一時テーブルから読み取って元のテーブルから削除します。 :
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);
...そして、テーブルには ID 1、4、および 7 が残っていtest
ます!
(また、前の行は <、ORDER BY、および LIMIT を使用して選択されるため、ID が連続していない場合にも機能します。)