2008-10-03 12 views
5

http://thedailywtf.com/Articles/The-Hot-Room.aspxMySQL: अगले और पिछले पंक्तियों सशर्त का चयन

आप देखते हैं कि कैसे वहाँ नीचे अगले और पिछले लेख ("Divide_By_Zero के लिए तैयार" और "पूरी तरह से अलग खेल") करने वाले हैं लिंक पर? मैं यह कैसे कर सकता हूं, लेकिन अगले और पिछले गैर-निजी लेखों का चयन कर रहा हूं? यह अगला आलेख चुनने के लिए काम करता है:

SELECT * FROM articles WHERE id > ? AND private IS NULL 

लेकिन मुझे पिछले लेख का चयन करने का कोई तरीका नहीं मिल रहा है।

ऐसा करने के लिए उचित/कुशल तरीका क्या है, अधिमानतः एक प्रश्न में?

उत्तर

9

या जेरेमी के जवाब का विस्तार ...
एक क्वेरी

(SELECT * FROM articles WHERE id > ? 
AND private IS NULL 
ORDER BY id ASC LIMIT 1) 
UNION 
(SELECT * FROM articles WHERE id < ? 
AND private IS NULL 
ORDER BY id DESC LIMIT 1) 
+2

यह आपके अजीब प्रदर्शन करता है जब आप अपने चयन के पहले/अंतिम रिकॉर्ड में होते हैं। यह सिर्फ एक रिकॉर्ड देता है, लेकिन मुझे यह पता लगाने का कोई तरीका नहीं मिल रहा है। – Fuzzy76

+0

यदि वर्तमान आलेख आईडी 10 है और क्वेरी केवल एक परिणाम देता है, तो आप यहां क्या कर सकते हैं: - यदि आईडी 10 से कम है, तो लेख पुराना है - यदि आईडी 10 से अधिक है, तो लेख नया है यदि यह अभी भी समस्या को हल नहीं कर रहा है, तो आप क्वेरी का विस्तार कर सकते हैं और कुछ अर्थपूर्ण कॉलम जोड़ सकते हैं, जैसे 'चयन' नया 'जैसे, * लेखों से ... ' –

5

यहाँ कैसे मैं यह कर देगा:

-- next 
SELECT * FROM articles WHERE id > ? AND private IS NULL ORDER BY id ASC LIMIT 1 

-- previous 
SELECT * FROM articles WHERE id < ? AND private IS NULL ORDER BY id DESC LIMIT 1 

मैं कैसे एक क्वेरी में यह करने के लिए यकीन नहीं है। एकमात्र चीज जिसे मैं सोच सकता हूं वह संभवतः आपके द्वारा प्रदर्शित किए जा रहे लेख और अगले लेख को एक प्रश्न में प्राप्त कर रहा है, लेकिन यह बहुत भ्रमित हो सकता है।

2

में कैसे एक के बारे में चयन नेस्ट?

SELECT * FROM articles WHERE id IN (
    SELECT id FROM articles WHERE id > ? AND private IS NULL ORDER BY id ASC LIMIT 1) 
) 
OR id IN (
    SELECT id FROM articles WHERE id < ? AND private IS NULL ORDER BY id DESC LIMIT 1 
); 
2

आप अपने विशेष मामले में subselects आदि के साथ प्राप्त कर सकते हैं, लेकिन आप कुछ भी और अधिक जटिल (उदाहरण के लिए की जरूरत है: एक प्रारंभिक संतुलन और भुगतान और शुल्क-वापसी की एक सूची दी गई है, समय के हर बिंदु पर खाते की शेष राशि की गणना) आप शायद एक संग्रहित प्रक्रिया लिखना चाहेंगे जो SQL REPEAT/WHILE/LOOP क्लॉज का उपयोग करती है और चर के उपयोग की अनुमति देती है और इसी तरह।

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