2008-11-01 25 views
87

मैं एक क्वेरी बनाना चाहता हूं जो तालिका में सभी परिणामों को प्रदर्शित करे, लेकिन तालिका की शुरुआत से 5 तक ऑफसेट हो। जहां तक ​​मैं कह सकता हूं, MySQL की LIMIT को एक सीमा के साथ-साथ ऑफ़सेट की आवश्यकता होती है। क्या इसे करने का कोई तरीका है?MySQL ऑफ़सेट असीमित पंक्तियां

+1

यह एक पूरी तरह से वैध सवाल है, लेकिन मुझे आश्चर्य है कि क्या कुछ बेहतर होगा और प्रोग्रामिंग के पहले कुछ रिकॉर्डों को नजरअंदाज करना बेहतर होगा। जो सबसे अच्छा जवाब लगता है (डरावनी 5, 1844674407370 9 551615) के डरावने को देखते हुए, मैं माईएसक्यूएल के सीमित सीमाओं के आसपास काम करने का बहुत अधिक समर्थन करता हूं। – cesoid

+2

@cesoid क्या होगा यदि आप '5000, 18446744073709551615' सीमा चाहते हैं। आप अपने कोड को सुंदर दिखने के लिए केवल अतिरिक्त 5000 पंक्तियां नहीं लाने जा रहे हैं। – elipoultorak

+0

@ user3576887 मुझे लगता है कि आप सही हैं, मैं सिर्फ इस विचार के साथ उपरोक्त प्रश्न पर विचार कर रहा था कि 5 कुछ अलग-अलग राशि की बजाय एकमात्र आवश्यकता थी, (और किसी और की समस्या को हल करने के बजाए)। – cesoid

उत्तर

124

है उपयोग करने की आवश्यकता:

प्राप्त करने के लिए के परिणाम सेसेट के अंत तक ऑफ़सेट होने पर सभी पंक्तियां, आप दूसरे पैरामीटर के लिए कुछ बड़ी संख्या का उपयोग कर सकते हैं। यह बयान 96 पंक्ति से पिछले करने के लिए सभी पंक्तियों को पुन: प्राप्त:

SELECT * FROM tbl LIMIT 95, 18446744073709551615; 
+83

भयानक! मैं यहां उम्मीद कर रहा था कि MySQL ने सीमा खंड वैकल्पिक बनाया है, जैसा कि यह है, लेकिन ऑफ़सेट के साथ भी ... लेकिन नहीं! मैंने इस कोड को 18446744073709551615 स्कैटर देखा है और मैं आलसी प्रोग्रामर को दोष दे रहा था, लेकिन यह एक डिज़ाइन सुविधा है! – Petruza

+7

भयानक उत्तर, लेकिन यह MySQL दस्तावेज़ से आधिकारिक है। मैं क्या कह सकता हूं @ _ @ – GusDeCooL

+16

18446744073709551615 उन लोगों के लिए 2^64-1 है जो सोच रहे थे। आप देखना चाहते हैं क्योंकि आप इस मान को 32 बिट पूर्णांक में स्टोर नहीं कर पाएंगे। आपको यह सुनिश्चित करना होगा कि आप संगतता सुनिश्चित करने के लिए इसे एक स्ट्रिंग के रूप में संग्रहीत करें। – AlicanC

17

आप इसे उल्लेख किया है केवल LIMIT की आवश्यकता है, तो आप सबसे बड़ी सीमा संभव है, जो 18446744073709551615 (अहस्ताक्षरित BIGINT की अधिकतम) से MySQL Manual on LIMIT

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5 
+24

वाह, क्या यह MySQL टीम का आधिकारिक समाधान है? – Antony

3

एक और दृष्टिकोण एक autoimcremented स्तंभ का चयन करने के लिए और उसके बाद होने का उपयोग कर इसे फ़िल्टर कर किया जाएगा।

SET @a := 0; 
select @a:[email protected] + 1 AS counter, table.* FROM table 
HAVING counter > 4 

लेकिन शायद मैं उच्च सीमा दृष्टिकोण के साथ रहूंगा।

0

बस आज मैं एक MySQL तालिका से बड़ी मात्रा में डेटा (दस लाख से अधिक पंक्तियों) प्राप्त करने का सबसे अच्छा तरीका पढ़ रहा था। एक तरीका है, जैसा कि सुझाव दिया गया है, LIMIT x,y का उपयोग करते हुए x ऑफ़सेट और y अंतिम पंक्ति जिसे आप वापस करना चाहते हैं। हालांकि, जैसा कि मैंने पाया, यह ऐसा करने का सबसे प्रभावी तरीका नहीं है। यदि आपके पास एक ऑटोइनक्रिकमेंट कॉलम है, तो आप आसानी से SELECT कथन का उपयोग WHERE क्लॉज के साथ कर सकते हैं, जिसमें कहा गया है कि आप किस रिकॉर्ड से शुरू करना चाहते हैं।

उदाहरण के लिए, SELECT * FROM table_name WHERE id > x;

ऐसा लगता है कि जब आप LIMIT का उपयोग कि mysql सभी परिणाम हो जाता है और उसके बाद ही आप रिकॉर्ड में फिट से पता चलता ऑफसेट: नहीं प्रदर्शन के लिए सबसे अच्छा।

स्रोत: इस प्रश्न का उत्तर MySQL Forums। बस ध्यान दें, सवाल लगभग 6 साल पुराना है।

+8

यदि आपने कभी भी एक रिकॉर्ड हटा दिया है तो यह गलत परिणाम देगा। यह विधि विशेष रूप से खतरनाक है, क्योंकि यह ज्यादातर समय काम करती है, और जब यह नहीं होती है तो चुपचाप विफल हो जाती है। – octern

-1

मुझे पता है कि यह पुराना है लेकिन मुझे एक समान प्रतिक्रिया दिखाई नहीं दे रही है, इसलिए यह वह समाधान है जिसका मैं उपयोग करूंगा।

सबसे पहले, मैं तालिका पर एक गिनती क्वेरी निष्पादित करता हूं यह देखने के लिए कि कितने रिकॉर्ड मौजूद हैं। यह क्वेरी तेज़ है और सामान्यतः निष्पादन समय नगण्य है। की तरह कुछ:

SELECT COUNT(*) FROM table_name; 

तब मैं अपने प्रश्न का निर्माण होगा परिणाम मैं अपने सीमा के रूप में गिनती से मिला का उपयोग कर (के बाद से है कि पंक्तियों की अधिकतम संख्या है तालिका संभवतः लौट सकता है)। की तरह कुछ:

SELECT * FROM table_name LIMIT count_result OFFSET desired_offset; 

या संभवतः कुछ की तरह:

SELECT * FROM table_name LIMIT desired_offset, count_result; 
बेशक

, यदि आवश्यक हो, तो आप count_result से desired_offset घटाना एक वास्तविक, सही मूल्य सीमा के रूप में आपूर्ति करने के लिए प्राप्त करने के लिए कर सकता है।"18446744073709551610" मान पास करने से मुझे समझ में नहीं आता है अगर मैं वास्तव में प्रदान करने के लिए उचित सीमा निर्धारित कर सकता हूं।

+0

7 एम रिकॉर्ड के साथ एक टेबल पर गिनती (*) का चयन करें 17s – amd

-5
WHERE .... AND id > <YOUROFFSET> 

आईडी किसी भी autoincremented या अद्वितीय संख्यात्मक स्तंभ आपने ...

+3

खराब विचार। यदि आपने कभी पंक्ति हटा दी है तो यह गलत ऑफसेट देगा। – octern

-1

यह अन्य question का उपयोग करते हुए और ग्रेग के जवाब के साथ कि चाल विलय हो सकता है, आप 0 का उपयोग कर सकते ~ अधिकतम अहस्ताक्षरित bigint के बजाय मूल्य:

SELECT * FROM tbl LIMIT ~0 OFFSET 95; 

या

SELECT * FROM tbl LIMIT 95, ~0; 
+0

ने मारियाडीबी 10.0 और MySQL 5.6 दोनों में इसका परीक्षण किया; काम नहीं करता –

+0

यह अजीब बात है, बेक्यूज मैं इस क्वेरी का उपयोग MySQL 5.6.25 में कर रहा हूं और यह काम करता है। मैंने मारिया डीबी में इसका परीक्षण नहीं किया है। क्या आप मुझे इस मुद्दे या कुछ पर्यावरण विवरण का उदाहरण दे सकते हैं? –

+1

MySQL कहते हैं 'एसक्यूएल वाक्यविन्यास; '~ 0'' – Hett

0

आप एक MYS उपयोग कर सकते हैं एलआईटी के साथ क्यूएल स्टेटमेंट:

START TRANSACTION; 
SET @my_offset = 5; 
SET @rows = (SELECT COUNT(*) FROM my_table); 
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?'; 
EXECUTE statement USING @rows, @my_offset; 
COMMIT; 

MySQL 5.5.44 में परीक्षण किया गया। इस प्रकार, हम संख्या 18446744073709551615 के सम्मिलन से बच सकते हैं।

नोट: लेनदेन सुनिश्चित करता है कि परिवर्तनीय @rows कथन के निष्पादन में विचाराधीन तालिका के लिए अनुबंध में है।

6

जैसा कि अन्य उत्तरों में बताया गया है, MySQL सीमा में रिकॉर्ड की संख्या के रूप में 18446744073709551615 का उपयोग करने का सुझाव देता है, लेकिन इस पर विचार करें: यदि आप 18,446,744,073,709,551,615 रिकॉर्ड प्राप्त करते हैं तो आप क्या करेंगे? वास्तव में, यदि आप 1,000,000,000 रिकॉर्ड प्राप्त करते हैं तो आप क्या करेंगे?

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

यदि आपको वास्तव में अपने डेटाबेस से सभी 18 क्विंटल रिकॉर्ड प्राप्त करना होगा, तो शायद आप जो चाहते हैं वह 100 मिलियन की वृद्धि और 184 बिलियन गुना लूप में उन्हें पकड़ना है।

+0

आप सही हैं, लेकिन डेवलपर को यह निर्णय रखना अच्छा विकल्प नहीं है – amd

+0

@amd क्या आप इसे थोड़ा और समझा सकते हैं? मुझे नहीं पता कि आप क्या कहने की कोशिश कर रहे हैं। – cesoid

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