आपको मूल रूप से ऐसे प्रश्नों को संग्रहीत कार्यविधियों LIMIT पर कुछ सीमाओं के कारण . आप सादे एसक्यूएल में उप चयन या चर का उपयोग नहीं कर सकते हैं। संग्रहीत कार्यविधियों में आप चर का उपयोग कर सकते हैं।
यह काम करता है, दुर्भाग्य से मैं इसे sqlfiddle में नहीं दिखा सकता क्योंकि ऐसा लगता है कि उनके पास संग्रहित प्रक्रियाओं के लिए सीमित समर्थन है।
drop procedure if exists all_but_3;
delimiter //
create procedure all_but_3()
begin
declare v_max bigint unsigned default ~0;
select * from your_table limit 3, v_max;
end//
delimiter ;
drop procedure if exists last_3;
delimiter //
create procedure last_3()
begin
declare v_max bigint;
declare v_mid bigint;
select count(*) from your_table into v_max;
set v_mid := v_max - 3;
select * from your_table limit v_mid, v_max;
end//
delimiter ;
call all_but_3();
call last_3();
InnoDB क्लस्टर इंडेक्स पर विस्तार
@fthiella के साथ अन्य उत्तरों में से एक में चर्चा के बाद मैंने कुछ विस्तार करने का निर्णय लिया है कि यह कैसे काम कर सकता है।
इंजन के रूप में InnoDB का उपयोग करने वाली तालिका में हमेशा एक संकुल अनुक्रमणिका होगी। हमेशा। इस तरह डेटा को InnoDB में संग्रहीत किया जाता है और क्लस्टर इंडेक्स के बिना तालिका बनाना किसी भी तरह से संभव नहीं है।
InnoDB प्राथमिक कुंजी का चयन करेगा यदि कोई एक या पहली अद्वितीय अनुक्रमणिका है जिसमें सभी कॉलम शून्य पर सेट हैं। यदि ऐसी कोई अनुक्रमणिका मौजूद नहीं है तो InnoDB एक पंक्ति आईडी के साथ एक छिपा हुआ कॉलम बनाएगा। यह पंक्ति आईडी ऑटो इंक्रीमेंट के समान काम करती है और अगर यह ऑटो इंक्रीमेंट के साथ एक अदृश्य कॉलम के रूप में इसके बारे में सोचने में मदद करती है तो मुझे लगता है कि यह ठीक है।
इसके अलावा InnoDB उपयोग किए गए इंडेक्स के अनुसार पंक्तियों को लौटाएगा। यह हमेशा कुछ अनुक्रमणिका का उपयोग करेगा (डेटा पुनर्प्राप्त करने का एकमात्र तरीका या तो द्वितीयक अनुक्रमणिका, संकुल अनुक्रमणिका या संयोजन का उपयोग करना है) इसलिए उस स्थिति में जहां कोई स्पष्ट रूप से बनाई गई अनुक्रमणिका पंक्तियां छिपी हुई क्लस्टर अनुक्रमणिका द्वारा वापस नहीं की जाती हैं।
इसका अर्थ यह है कि बिना किसी प्राथमिक कुंजी वाली तालिका के विरुद्ध कोई क्वेरी और सभी स्तंभों के साथ कोई अद्वितीय अनुक्रमणिका शून्य नहीं है और कोई ORDER BY पंक्तियों को उस क्रम में वापस नहीं करेगा जहां उन्होंने डाला था।
इस प्रश्न और मेरे और कई अन्य उत्तरों के आधार के लिए यही स्थिति है।
मेरे कहने का मतलब यह नहीं है कि डेटा के साथ काम करने का यह एक अच्छा तरीका है। इस समाधान का उपयोग करने से पहले आपको कुछ बातों पर ध्यान देना चाहिए:
- यदि एक इंडेक्स जिसे क्लस्टर इंडेक्स के रूप में इस्तेमाल किया जा सकता है, कभी भी उस इंडेक्स का उपयोग करने के लिए टेबल को फिर से लिखा जाएगा और ऐसा करके डिस्क पर डेटा ऑर्डर करें। यदि अनुक्रमणिका को बाद में गिरा दिया जाता है, तो मूल सम्मिलन क्रम खो जाता है और उसे पुनः प्राप्त नहीं किया जा सकता है।
- यदि कोई अनुक्रमणिका बनाई जाती है, भले ही वह अद्वितीय न हो, तो उसे उपयोग करने के लिए अनुकूलक द्वारा चुना जा सकता है और इसके बजाय पंक्तियों को उस अनुक्रमणिका द्वारा क्रमित किया जाएगा।
यह सब प्रलेखित है और 5.5 के लिए यह यह पृष्ठ