मान तालिका test
नामित और 0 नाम कॉलम के लिए निहित था चलोऔर data
।
हम एक का चयन करें हमें सभी पंक्तियों एक पिछली पंक्ति (सभी आईडी के उच्चतम आईडी कम हमारे वर्तमान पंक्ति के आईडी से) है कि आईडी देता है कि के साथ शुरू:
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)
हमें आईडी देता है कि 3 और 6. उनकी पिछली पंक्तियों में 2 और 5 में %X%
है, इसलिए यह अच्छा है।
अब, पंक्तियों %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 में उसी तालिका से चयन नहीं कर सकते हैं - इसलिए अस्थायी तालिका का उपयोग करें, हमारे आईडी को संग्रहीत करें जिन्हें हटाया जाना है, और फिर उस अस्थायी तालिका को हटाने के लिए पढ़ें हमारे मूल मेज से:
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);
... और हम छोड़ दिया जाता है आईडी 1, 4 और 7 हमारे test
तालिका में साथ!
(और चूंकि पिछली पंक्तियों का चयन <, ऑर्डर बीई और एलटीटी का उपयोग करके किया जाता है, यह भी काम करता है अगर आईडी लगातार नहीं हैं।)
@Aiias: यह एक बिल्कुल अलग सवाल है। – duskwuff