MySQL में उपक्वेरी का उपयोग करके OFFSET के बाद क्रमबद्ध रिकॉर्ड प्राप्त करना
किसी ऑफसेट (OFFSET) के बाद की पंक्तियों को एक विशिष्ट क्रम में प्राप्त करने के लिए, उपक्वेरी (सबक्वेरी) में पहले ORDER BY और LIMIT लागू करें, फिर बाहरी क्वेरी में पुनः क्रमबद्ध करें।
उदाहरण के साथ पूर्ण कार्यान्वयन
टेबल बनाना
mysql> CREATE TABLE DemoTable618 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName VARCHAR(100)
);
रिकॉर्ड डालना
mysql> INSERT INTO DemoTable618(StudentFirstName) VALUES
('David'), ('Chris'), ('Robert'), ('Sam'), ('Mike'), ('Carol'), ('Bob'), ('John');
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable618;
आउटपुट:
+-----------+------------------+
| StudentId | StudentFirstName |
+-----------+------------------+
| 1 | David |
| 2 | Chris |
| 3 | Robert |
| 4 | Sam |
| 5 | Mike |
| 6 | Carol |
| 7 | Bob |
| 8 | John |
+-----------+------------------+
8 rows in set (0.00 sec)
OFFSET 5 के बाद 4 पंक्तियाँ, अवरोही क्रम में
mysql> SELECT * FROM (
SELECT StudentId, StudentFirstName
FROM DemoTable618
WHERE StudentId >= 5
ORDER BY StudentId
LIMIT 4
) tbl
ORDER BY tbl.StudentId DESC;
आउटपुट:
+-----------+------------------+
| StudentId | StudentFirstName |
+-----------+------------------+
| 8 | John |
| 7 | Bob |
| 6 | Carol |
| 5 | Mike |
+-----------+------------------+
4 rows in set (0.00 sec)
चरण-दर-चरण व्याख्या:
- WHERE StudentId >= 5: ID 5 से शुरू होने वाली पंक्तियाँ (5,6,7,8)
- ORDER BY StudentId: आरोही क्रम (5,6,7,8)
- LIMIT 4: ये 4 पंक्तियाँ चुनता है
- बाहरी ORDER BY DESC: परिणाम को उलट देता है (8,7,6,5)
सरल विकल्प: OFFSET और LIMIT
-- ID 5 से शुरू करके 4 पंक्तियाँ (OFFSET 4 = पहले 4 छोड़ें)
SELECT * FROM DemoTable618
WHERE StudentId >= 5
ORDER BY StudentId DESC
LIMIT 4;
यह समान परिणाम देता है लेकिन अधिक सरल है। उपक्वेरी दृष्टिकोण तब उपयोगी होता है जब:
- आंतरिक और बाहरी क्रम अलग-अलग हों
- जटिल फ़िल्टरिंग के बाद क्रमबद्ध करना हो
- पेजिनेशन में पृष्ठ उलटना हो
पेजिनेशन पैटर्न
-- पृष्ठ 1 (पहले 10)
SELECT * FROM posts ORDER BY created_at DESC LIMIT 10 OFFSET 0;
-- पृष्ठ 2 (अगले 10)
SELECT * FROM posts ORDER BY created_at DESC LIMIT 10 OFFSET 10;
-- सामान्य सूत्र: LIMIT page_size OFFSET (page_num - 1) * page_size
बड़े ऑफसेट के लिए अनुकूलन
बड़े OFFSET पर प्रदर्शन गिरता है। बेहतर: "सीक मेथड" (keyset pagination):
SELECT * FROM posts
WHERE created_at < '2024-01-15 10:00:00' -- अंतिम देखी गई तारीख
ORDER BY created_at DESC
LIMIT 10;