假設表被命名爲test
幷包含名爲0列和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他們前面的第2和第5行包含%X%
,所以這很好。
現在讓我們得到包含%X%
並與前面的結合他們行的ID,通過UNION:
(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);
...我們留下了我們test
表的ID 1,4和7!
(並且由於前面的行使用<,ORDER BY和LIMIT來選擇,所以如果ID不連續,這也可以工作。)
@Aiaias:這是一個完全不同的問題。 – duskwuff 2013-03-17 04:34:49