MySQL

2008-10-28 36 views
32

में परिवर्तनीय LIMIT क्लॉज मैं संग्रहीत प्रक्रिया लिख ​​रहा हूं जहां मेरे पास एक इनपुट पैरामीटर है जिसे my_size कहा जाता है जो एक int है, मैं एक चयन कथन में सीमा खंड में उपयोग करने में सक्षम होना चाहता हूं। जाहिर है यह समर्थित नहीं है, क्या इस के आसपास काम करने का कोई तरीका है?MySQL

# I want something like: 
SELECT * FROM some_table LIMIT my_size; 

# Instead of hardcoding a permanent limit: 
SELECT * FROM some_table LIMIT 100; 
+0

आप MySQL का कौन सा संस्करण आप उपयोग पर नियंत्रण है, तो यह इस तरह v5.5.6 में शुरू तय हो गई है लग रहा है। http://bugs.mysql.com/bug.php?id=11918 – Hammerite

+0

एक और आसान समाधान मिला http://stackoverflow.com/a/4315661 – user3011839

+0

ध्यान दें कि * MySQL 5.7.16 * (और शायद अन्य) में ' एक संग्रहीत दिनचर्या में LIMIT @nrows ऑफ़सेट @ noffset' भी अस्वीकार कर दिया जाता है, जबकि 'LIMIT nrows ऑफ़सेट ऑफसेट' स्वीकार किया जाता है, जब तक कि आप अस्वीकार करते हैं; दिनचर्या की शुरुआत में डेक्लेयर ऑफसेट INT'। – Xenos

उत्तर

9

एक खोज this article चालू हुई। मैंने नीचे प्रासंगिक पाठ चिपकाया है।

यहाँ एक मंच दे आप सीमा खंड को एक चर मान असाइन तैयार बयान का एक उदाहरण दिखा पोस्ट है:

http://forums.mysql.com/read.php?98,126379,133966#msg-133966

हालांकि, मुझे लगता है कि इस बग कुछ ध्यान जाना चाहिए क्योंकि मैं यह कर सकते हैं टी कल्पना करें कि किसी प्रक्रिया के भीतर तैयार बयान किसी भी प्रक्रिया-संकलन-समय अनुकूलन की अनुमति देगा। मुझे लगता है कि तैयार कथन संकलित और प्रक्रिया के रनटाइम पर निष्पादित किए जाते हैं, जो प्रोबबी का दक्षता पर नकारात्मक प्रभाव पड़ता है। यदि सीमा खंड सामान्य प्रक्रिया चर (कहां, एक प्रक्रिया तर्क) स्वीकार कर सकता है, तो डेटाबेस अभी भी प्रक्रिया के भीतर शेष क्वेरी पर संकलन-समय अनुकूलन निष्पादित कर सकता है। यह संभवतः प्रक्रिया के तेज़ी से निष्पादन प्रदान करेगा। हालांकि मैं कोई विशेषज्ञ नहीं हूं।

12

मुझे पता है कि यह उत्तर देर से आया है, लेकिन SQL_SELECT_LIMIT आज़माएं।

उदाहरण:

Declare rowCount int; 
Set rowCount = 100; 
Set SQL_SELECT_LIMIT = rowCount; 
Select blah blah 
Set SQL_SELECT_LIMIT = Default; 
+2

दुर्भाग्यवश स्थिति शुरू करने के लिए तर्क का समर्थन नहीं करता है, जैसे कि स्थिति 5 से 2 पंक्तियों को लेने के लिए 5,2 की तरह। लेकिन जब तक आपको इसकी आवश्यकता न हो तो यह चाल हो सकती है। – Gruber

+0

दुर्भाग्यवश यह चाल 'SELECT ...' के लिए काम नहीं करती है जैसे 'प्रतिस्थापन ... चुनें ...'। – Apostle

7

यह सुविधा MySQL 5.5.6 में जोड़ा गया है। इस link बाहर की जाँच करें।

मैंने इस सुविधा के लिए केवल MySQL 5.5 में अपग्रेड किया है और बहुत अच्छा काम करता है। 5.5 में भी बहुत सारे प्रदर्शन उन्नयन हैं और मैं पूरी तरह से इसकी अनुशंसा करता हूं।

13

प्रक्रिया

DELIMITER $ 
create PROCEDURE get_users(page_from INT, page_size INT) 
begin 
SET @_page_from = page_from; 
SET @_page_size = page_size; 
PREPARE stmt FROM "select u.user_id, u.firstname, u.lastname from users u limit ?, ?;"; 
EXECUTE stmt USING @_page_from, @_page_size; 
DEALLOCATE PREPARE stmt; 
end$ 
DELIMITER ; 

उपयोग

call get_users(1, 10); 
+0

मेरे लिए सबसे अच्छा काम किया - धन्यवाद – auval

2

एक और तरीका है, लिखा था "प्रदीप संजय" के रूप में ही है, लेकिन का उपयोग कर concat संग्रहीत:

CREATE PROCEDURE `some_func`(startIndex INT, countNum INT) 
READS SQL DATA 
    COMMENT 'example' 
BEGIN 
    SET @asd = CONCAT('SELECT `id` FROM `table` LIMIT ',startIndex,',',countNum); 
    PREPARE zxc FROM @asd; 
    EXECUTE zxc; 
END; 
+0

** 'PREPARE' ** और **' EXECUTE' ** कथन का उपयोग करने के साथ यह बहुत अच्छा समाधान है। एक महत्वपूर्ण नोट: हमें प्रक्रिया बनाने का उपयोग करने की आवश्यकता नहीं है। हम प्रमुख कोड एसक्यूएल में ** 'PREPARE' ** और **' EXECUTE' ** कथन का भी उपयोग कर सकते हैं। –

20

उन लोगों के लिए , जो उपयोग नहीं कर सकते हैं MySQL 5.5.6+ और संग्रहित प्रक्रिया लिखना नहीं चाहते हैं, एक और संस्करण है। हम ROWNUM के साथ उप-चयन पर खंड कहां जोड़ सकते हैं।

SET @limit = 10; 
SELECT * FROM (
    SELECT instances.*, 
     @rownum := @rownum + 1 AS rank 
    FROM instances, 
     (SELECT @rownum := 0) r 
) d WHERE rank < @limit; 
+1

मुझे चयन के अंदर @ ड्राउनम की शुरुआत पसंद है, अच्छा! – andig

1

MySQL संस्करण 5.5.6 के रूप में, आप LIMIT और चर/पैरामीटर के साथ OFFSET निर्दिष्ट कर सकते हैं।

संदर्भ के लिए, 5.5 Manual, 5.6 Manual और @ देखना Quassnoi के answer