假设该表已命名test
并包含在名为 和 的列id
中data
。
我们从一个 SELECT 开始,它为我们提供具有前一行的所有行的 id(所有 id 中的最高 id 低于当前行的 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 )
这给了我们 ID 3 和 6。它们前面的第 2 行和第 5 行包含%X%
,所以这很好。
现在让我们通过 UNION 获取包含行的 id%X%
并将它们与之前的行组合:
(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);
...我们的表中只剩下 ids 1、4 和 7 了test
!
(并且由于之前的行是使用 <、ORDER BY 和 LIMIT 选择的,因此如果 id 不连续,这也适用。)