MySQL अनंत पंक्तियों को ऑफसेट करता है


114

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


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

3
@ अगर आप चाहें तो क्या करें limit 5000, 18446744073709551615। आप सुंदर दिखने के लिए अपने कोड के लिए अतिरिक्त 5000 पंक्तियों को लाने नहीं जा रहे हैं।
एलीपुलटोरक

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

मेरा सुझाव है कि यह इतना दुर्लभ कार्य है कि समाधान की कुरूपता को स्वीकार किया जा सकता है।
रिक जेम्स

जवाबों:


151

से सीमा पर MySQL मैनुअल :

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

SELECT * FROM tbl LIMIT 95, 18446744073709551615;

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

8
awfull जवाब, लेकिन thats MySQL डॉक्टर से आधिकारिक है। मैं क्या कह सकता हूं @ _ @
GusDeCooL

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

13
भयानक! उन्हें उस से अधिक सुरुचिपूर्ण होने की आवश्यकता है ... Limit -1या Limit Nullबहुत उचित लगता है! या कम से कम सीमा को एक उपश्रेणी को स्वीकार करना चाहिए जैसेselect * from table limit (select count(*) from table)
वल्कन रैवेन

19
अतिप्रवाह प्रभावों से बचने के लिए php 'PHP_INT_MAX' का उपयोग करें।
कार्ल एडलर

24

जैसा कि आपने उल्लेख किया है कि लिमिट की आवश्यकता है, इसलिए आपको सबसे बड़ी सीमा का उपयोग करने की आवश्यकता है, जो 18446744073709551615 (अहस्ताक्षरित बिग्गंट की अधिकतम) है

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5

33
वाह, क्या यह MySQL टीम का आधिकारिक समाधान है?
एंटनी

12

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

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

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


आप ठीक कह रहे हैं, लेकिन डेवलपर के लिए यह निर्णय रखने एक अच्छा विकल्प नहीं है
AMD

@ मैं आपको समझा सकता हूं कि थोड़ा और? मैं नहीं जानता कि आप क्या कहना चाह रहे हैं।
19'17

1
@ इस्सोइड मुझे लगता है कि वह कह रहा है कि देवों को व्यवसायिक तर्क को चुनने के लिए नहीं होना चाहिए, जिससे मैं सहमत हूं, लेकिन केवल एक बिंदु पर। मान लीजिए कि आप किसी ग्राहक को ऑर्डर की सूची लौटा रहे हैं। एक बार में एक लाख से अधिक कहना कभी भी पूरी तरह से उचित नहीं है, लेकिन 100 तक सीमित होने से भ्रम पैदा हो सकता है।
शरद ऋतु लियोनार्ड

@ मैं यह नहीं कह रहा हूं कि डेवलपर को 18446744073709551615 का उपयोग करने से बचने के लिए ऐप के व्यवहार को बदलना चाहिए। मैं कह रहा हूं कि उन्हें इस बात पर विचार करना चाहिए कि क्या उस नंबर का उपयोग ग्राहक या इंटरफ़ेस डिजाइनर के कार्यान्वयन के हिस्से के रूप में समझ में आता है। ने अनुरोध किया है, और यह किसी भी चीज़ के लिए सही कार्यान्वयन होने की संभावना नहीं है। MySQL का उपयोग करने का निर्णय संभवतः पहले से ही डेवलपर द्वारा यह पूछे बिना किया गया था कि क्या 18 क्विंटल से अधिक कुछ होगा।
cesoid

5

एक अन्य दृष्टिकोण एक स्व-प्रतिरक्षित कॉलम का चयन करना होगा और फिर इसे HAVING का उपयोग करके फ़िल्टर करना होगा।

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

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


धन्यवाद, और मुझे आश्चर्य है कि मैं PHP कथन में ऐसी क्वेरी कैसे डाल सकता हूं! मेरा मतलब है कि इस तरह से$sql = 'SET @a :=0 SELECT .....';
रेहम फहमी

2

जैसा कि दूसरों ने उल्लेख किया है, MySQL मैनुअल से। इसे प्राप्त करने के लिए, आप एक अहस्ताक्षरित बड़े इंट के अधिकतम मूल्य का उपयोग कर सकते हैं, यह है भयानक संख्या (18446744073709551615)। लेकिन इसे थोड़ा कम गन्दा करने के लिए आप "~" बिटवाइज़ ऑपरेटर को टिल्ड कर सकते हैं।

  LIMIT 95, ~0

यह एक बिटवाइस नकार के रूप में काम करता है। "~ 0" का परिणाम 18446744073709551615 है।


1
मारियाडीबी 10.3 में काम नहीं करता है :( मैंने दोनों की कोशिश की LIMIT 5, ~0और LIMIT ~0 OFFSET 5क्या यह एक MySQL 8.0 सुविधा है?
jururiks

1
यह MySQL 5.7 - अमान्य सिंटैक्स में कोई बात नहीं है।
जॉनी नॉट

0

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

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

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

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


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

0

आप लोहिट के साथ MySQL स्टेटमेंट का उपयोग कर सकते हैं:

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 की प्रविष्टि से बच सकते हैं।

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


जैसा कि @amd ने कहा: "7M रिकॉर्ड के साथ एक मेज पर" काउंट काउंट (*) को लगभग 17s लगते हैं "
रोड्रिोकर

-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 से वांछित_ऑफ़सेट घटा सकते हैं। "18446744073709551610" मूल्य पास करना बस समझ में नहीं आता है अगर मैं वास्तव में प्रदान करने के लिए एक उपयुक्त सीमा निर्धारित कर सकता हूं।


2
7M रिकॉर्ड के साथ एक मेज पर गिनती (*) का चयन 17s चारों ओर ले जाता है
AMD

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

आईडी आपके पास कोई भी स्वयंभू या अद्वितीय संख्यात्मक कॉलम हो सकता है ...


7
बुरा विचार। यदि आपने कभी कोई पंक्ति हटाई है तो यह गलत ऑफ़सेट देगा।
अष्टकप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.