2010-10-13 10 views
8

सबसे पहले, यह क्वेरी है जो "प्लेयर इतिहास" बनाता है जिसे आप जितनी बार चाहें निष्पादित किया जा सकता है और यह केवल नया इतिहास बनायेगा यदि कल के लिए कोई इतिहास पंक्ति नहीं है या अतीत में नवीनतम इतिहास प्रविष्टि के बाद मूल्य बदल गए हैं तो खिलाड़ियों के लिए पंक्तियां।MySQL विशेषज्ञ: x दिनों से पुरानी सभी पंक्तियों को हटाएं लेकिन नवीनतम

INSERT INTO `player_history` (`player_id`, `date`, `races`, `maps`, `playtime`, `points`) 
SELECT `p`.`id`, DATE_SUB(NOW(), INTERVAL 1 DAY), `p`.`races`, `p`.`maps`, `p`.`playtime`, `p`.`points` 
FROM `player` `p` 
WHERE `p`.`playtime` IS NOT NULL 
AND `p`.`playtime` > 0 
AND (
    SELECT `player_id` 
    FROM `player_history`^ 
    WHERE `player_id` = `p`.`id` 
    AND (
     `date` = DATE_SUB(NOW(), INTERVAL 1 DAY) 
     OR (
      `date` < DATE_SUB(NOW(), INTERVAL 1 DAY) 
      AND `races` = `p`.`races` 
      AND `points` = `p`.`points` 
      AND `maps` = `p`.`maps` 
      AND `playtime` = `p`.`playtime` 
     ) 
    ) 
    ORDER BY `date` DESC 
    LIMIT 1 
) IS NULL; 

अब समस्या मैं भी एक ही क्वेरी का उपयोग कर इतिहास तालिका सफाई करना चाहते हैं। यह पहले से ही 10 दिनों से अधिक पुरानी सभी इतिहास प्रविष्टियों का चयन करता है लेकिन नवीनतम। लेकिन मैं सिर्फ चयन * के बजाय DELETE करना पसंद नहीं कर सकता।

SELECT * 
FROM `player_history` `ph` 
WHERE `date` < DATE_SUB(NOW(), INTERVAL 10 DAY) 
AND `date` != (SELECT `date` 
    FROM `player_history` 
    WHERE `player_id` = `ph`.`player_id` 
    ORDER BY `date` DESC 
    LIMIT 1); 

तो क्या मैं एक ही डिलीट क्वेरी का उपयोग करने के लिए एक तरीका है?

उत्तर

9

आपकी क्वेरी मेरी आंखों में सही दिखती है लेकिन आपके पास सबक्वायरी में अंतराल नहीं है।

मैं यह कर जाएगा:

DELETE FROM player_history 
WHERE date < DATE_SUB(NOW(), INTERVAL 10 DAY) 
AND date != (
    SELECT MAX(date) FROM player_history 
    WHERE date < DATE_SUB(NOW(), INTERVAL 10 DAY) 
) 

mysql से त्रुटि संदेश क्या है?

1

शायद आप क्योंकि documentation राज्यों किसी एक क्वेरी में ऐसा नहीं कर सकते:

वर्तमान में, आप एक मेज से नहीं हटा सकते हैं और एक सबक्वेरी में एक ही मेज से का चयन करें।

एक समाधान आप पंक्तियों है कि आईडी को चुन सकते हैं के रूप में एक अस्थायी तालिका में हटाए जाने के लिए और उसके बाद मूल मेज से रिकॉर्ड नष्ट करने के लिए बयान को हटाने के लिए एक बहु तालिका का उपयोग करें।

संबंधित मुद्दे