মাইএসকিউএল অফসেট সারি অফসেট করে


114

আমি একটি কোয়েরি তৈরি করতে চাই যা একটি সারণীতে সমস্ত ফলাফল প্রদর্শন করে, তবে টেবিলের শুরু থেকে 5 দ্বারা অফসেট হয়। আমি যতদূর বলতে পারি, মাইএসকিউএলস LIMITএকটি অফসেটের পাশাপাশি একটি সীমাও প্রয়োজন। এই কাজ করতে কোন উপায় আছে কি?


1
এটি একটি সম্পূর্ণ বৈধ প্রশ্ন, তবে আমি অবাক হয়েছি যদি আরও ভাল কিছু হয় তবে সবকিছু গ্রহণ এবং প্রথম কয়েকটি রেকর্ডকে প্রোগ্রামগতভাবে উপেক্ষা করা। সেরা উত্তর বলে মনে হচ্ছে এর ভয়াবহতা দেওয়া (সীমা 5, 18446744073709551615), আমি মাইএসকিউএল এর লিমিটের সীমাবদ্ধতার আশপাশে কাজ করার পক্ষে চাই।
সিএসয়েড

3
আপনি চাইলে @ এসিড করুন limit 5000, 18446744073709551615। আপনার কোডটি সুন্দর দেখানোর জন্য আপনি অতিরিক্ত 5000 সারি আনতে যাচ্ছেন না।
এলিপল্টোরাক

@ ব্যবহারকারী 3576887 আমি মনে করি আপনি ঠিক বলেছেন, কিছুটা ভিন্নতর পরিমাণের চেয়ে আরও বড় পরিমাণের চেয়ে (এবং অন্য কারও সমস্যা সমাধানের চেয়ে) পরিবর্তে 5 কেবলমাত্র প্রয়োজন বলে ধরে নিয়ে আমি উপরের প্রশ্নটি বিবেচনা করছি।
সিসয়েড

আমি পরামর্শ দিচ্ছি যে এটি এমন একটি বিরল কাজ যে সমাধানটির কদর্যতা গ্রহণ করা যেতে পারে।
রিক জেমস

উত্তর:


151

সীমাবদ্ধতায় মাইএসকিউএল ম্যানুয়াল থেকে :

ফলাফল সেটের শেষ অবধি নির্দিষ্ট অফসেট থেকে সমস্ত সারি পুনরুদ্ধার করতে, আপনি দ্বিতীয় প্যারামিটারের জন্য কিছু বড় সংখ্যা ব্যবহার করতে পারেন। এই বিবৃতিটি 96 তম সারি থেকে শেষ পর্যন্ত সমস্ত সারি পুনরুদ্ধার করে:

SELECT * FROM tbl LIMIT 95, 18446744073709551615;

105
ভয়াবহ, আতঙ্কজনক! আমি এখানে এসে এই আশা করে এসেছি যে মাইএসকিউএল যেমন সীমাবদ্ধতা ধারাটি optionচ্ছিকভাবে তৈরি করেছে তবে এটি একটি অফসেট সরবরাহ করেছে ... তবে না! আমি এই 18446744073709551615 পুরো কোড জুড়ে ছড়িয়ে ছিটিয়ে দেখেছি এবং আমি অলস প্রোগ্রামারদের দোষ দিচ্ছিলাম, তবে এটি একটি ডিজাইনের বৈশিষ্ট্য!
পেট্রুজা

8
অদ্ভুত উত্তর, তবে এটি মাইএসকিউএল ডক থেকে সরকারী। আমি কি বলতে পারি @ _ @
GusDeCooL

21
যারা ভাবছিলেন তাদের জন্য 18446744073709551615 2 ^ 64-1। আপনি নজর রাখতে চাইতে পারেন কারণ আপনি এই মানটি 32 বিট পূর্ণসংখ্যায় সঞ্চয় করতে পারবেন না। সামঞ্জস্যতা নিশ্চিত করতে আপনাকে এটি স্ট্রিং হিসাবে সঞ্চয় করতে হবে তা নিশ্চিত করতে হবে।
অ্যালিকানস

13
ভয়ানক! তাদের চেয়ে আরও মার্জিত হওয়া দরকার ... Limit -1বা Limit Nullদেখতে বেশ যুক্তিসঙ্গত দেখাচ্ছে! বা অন্তত সীমা মত একটি subquery গ্রহণ করা উচিতselect * from table limit (select count(*) from table)
Vulcan গোগ্রাসে গেলা

19
অতিরিক্ত প্রবাহের প্রভাব এড়াতে পিএইচপি 'PHP_INT_MAX' ব্যবহার করুন।
কার্ল অ্যাডলার 15

24

যেমনটি আপনি উল্লেখ করেছেন যে সীমাবদ্ধতা আবশ্যক, সুতরাং আপনার পক্ষে সর্বাধিক সীমাবদ্ধতাটি ব্যবহার করা দরকার যা 18446744073709551615 (সই না হওয়া সর্বাধিক বিজিএনটি সর্বাধিক)

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5

33
বাহ, এটি কি মাইএসকিউএল টিমের অফিসিয়াল সমাধান?
অ্যান্টনি

12

অন্যান্য উত্তরে উল্লিখিত হিসাবে, মাইএসকিউএল 18446744073709551615 সীমাতে রেকর্ডের সংখ্যা হিসাবে ব্যবহার করার পরামর্শ দিচ্ছে, তবে এটি বিবেচনা করুন: আপনি 18,446,744,073,709,551,615 রেকর্ড ফিরে পেলে আপনি কী করবেন? আসলে, আপনি যদি 1,000,000,000 রেকর্ড পেয়ে থাকেন তবে আপনি কী করবেন?

হতে পারে আপনি এক বিলিয়নেরও বেশি রেকর্ড চান তবে আমার বক্তব্যটি হ'ল আপনি যে সংখ্যায় চান তার কিছুটা সীমাবদ্ধতা রয়েছে এবং এটি 18 পঞ্চাশেরও কম। স্থায়িত্ব, অপ্টিমাইজেশন এবং সম্ভবত ব্যবহারযোগ্যতার স্বার্থে, আমি কোয়েরিতে কিছু অর্থপূর্ণ সীমা রাখার পরামর্শ দেব। এটি এমন যেকোন ব্যক্তির জন্য বিভ্রান্তিও হ্রাস করবে যা এই magন্দ্রজালিক চেহারাটি কখনও দেখেনি এবং আপনি একবারে হ'ল কমপক্ষে কতগুলি রেকর্ড পরিচালনা করতে ইচ্ছুক তা যোগাযোগ করার অতিরিক্ত সুবিধা রয়েছে।

আপনার ডেটাবেস থেকে আপনার যদি অবশ্যই 18 টি কুইন্টিলিয়ন রেকর্ড পেতে হয় তবে আপনি যা চান তা হ'ল 100 মিলিয়ন এবং লুপ 184 বিলিয়ন বারের ইনক্রিমেন্টে গ্রাস করা।


আপনি ঠিক, কিন্তু বিকাশকারী এই সিদ্ধান্ত পালন একটি ভাল পছন্দ নয়
AMD

@ এমডি আপনি আরও কিছু ব্যাখ্যা করতে পারেন? আপনি কী বলতে চাইছেন তা আমি জানি না।
cesoid

1
@ এসিওয়েড আমি মনে করি তিনি বলছেন যে ডিভস ইচ্ছাকৃতভাবে ব্যবসার যুক্তিটি বেছে নেবেন না, যার সাথে আমি একমত, তবে কেবল একটি বিষয়। ধরা যাক আপনি কোনও গ্রাহকের কাছে আদেশের তালিকা ফিরিয়ে দিচ্ছেন। একবারে দশ মিলিয়নের বেশি আর ফিরে না আসা পুরোপুরি যুক্তিসঙ্গত, তবে 100 এ সীমাবদ্ধ রাখা বিভ্রান্তির কারণ হতে পারে।
শরত্কাল লিওনার্ড

@ এ্যামড আমি বলছি না যে 18446744073709551615 ব্যবহার এড়াতে বিকাশকারীর অ্যাপ্লিকেশনটির আচরণ পরিবর্তন করা উচিত I'm আমি বলছি যে ক্লায়েন্ট বা ইন্টারফেস ডিজাইনারের যেকোন কিছুই বাস্তবায়নের অংশ হিসাবে এই নম্বরটি ব্যবহার করা উচিত কিনা তা তাদের বিবেচনা করা উচিত অনুরোধ করেছে এবং এটি যে কোনও কিছুর জন্য সঠিক বাস্তবায়ন হওয়ার খুব কমই সম্ভাবনা। মাইএসকিউএল ব্যবহারের সিদ্ধান্তটি সম্ভবত বিকাশকারী ইতিমধ্যে কোনও কিছুর 18 পঞ্চাশেরও বেশি থাকবে কিনা তা জিজ্ঞাসা না করেই এই সিদ্ধান্ত নিয়েছিলেন।
সিসয়েড

5

আর একটি পদ্ধতি হ'ল একটি স্বতঃক্রিমিকৃত কলাম নির্বাচন করা এবং তারপরে এটি ব্যবহার করে ফিল্টার করা।

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

তবে আমি সম্ভবত উচ্চ সীমা পদ্ধতির সাথে লেগে থাকব।


আপনাকে ধন্যবাদ, এবং আমি ভাবছি কীভাবে আমি পিএইচপি বিবৃতিতে এই জাতীয় জিজ্ঞাসা রাখতে পারি! আমি $sql = 'SET @a :=0 SELECT .....';
সেভাবেই

2

অন্যরা যেমন উল্লেখ করেছে, মাইএসকিউএল ম্যানুয়াল থেকে। এটি অর্জন করতে, আপনি স্বাক্ষরবিহীন বড় ইন্টের সর্বোচ্চ মানটি ব্যবহার করতে পারেন, এটি হ'ল ভয়ঙ্কর সংখ্যা (18446744073709551615)। তবে এটিকে কিছুটা কম অগোছালো করতে আপনি টিলড "~" বিটওয়াইস অপারেটর করতে পারেন।

  LIMIT 95, ~0

এটি কিছুটা অবহেলা হিসাবে কাজ করে। "~ 0" এর ফলাফল 18446744073709551615।


1
মারিয়াডিবি 10.3 তে কাজ করে না :( আমি উভয়ই চেষ্টা করেছি LIMIT 5, ~0এবং এটি LIMIT ~0 OFFSET 5কি মাইএসকিউএল 8.0 বৈশিষ্ট্য?
জুরচিক্স

1
এটি মাইএসকিউএল 5.7-এ কোনও জিনিস নয় - অবৈধ সিনট্যাক্স।
জনি নট

0

ঠিক আজ আমি একটি মাইএসকিএল টেবিল থেকে বিপুল পরিমাণে ডেটা (এক মিলিয়ন সারি বেশি) পাওয়ার সর্বোত্তম উপায় সম্পর্কে পড়ছিলাম। একটি উপায় হ'ল প্রস্তাবিত হিসাবে, অফসেটটি LIMIT x,yকোথায় xএবং আপনি yযে শেষ সারিতে ফিরে আসতে চান তা ব্যবহার করে। তবে, যেমন আমি জানতে পেরেছি, এটি করার পক্ষে এটি সবচেয়ে কার্যকর উপায় নয়। আপনার যদি একটি স্বয়ংসোধক কলাম থাকে তবে আপনি সহজেই SELECTকোনও WHEREক্লজ সহ একটি বিবৃতি ব্যবহার করতে পারেন যা বলছেন যে আপনি কোন রেকর্ডটি শুরু করতে চান।

উদাহরণ স্বরূপ, SELECT * FROM table_name WHERE id > x;

দেখে মনে হচ্ছে যে আপনি যখন ব্যবহার করবেন তখন মাইএসকিএল সমস্ত ফলাফল পেয়ে যায় LIMITএবং তারপরে কেবল আপনাকে অফসেটে থাকা রেকর্ডগুলি দেখায়: পারফরম্যান্সের জন্য সেরা নয়।

উত্স: এই প্রশ্নের মাইএসকিউএল ফোরামের উত্তর দিন । শুধু খেয়াল করুন, প্রশ্নটি প্রায় 6 বছরের পুরনো।


13
আপনি যদি কোনও রেকর্ড মুছে ফেলে থাকেন তবে এটি ভুল ফলাফল দেবে। এই পদ্ধতিটি বিশেষত বিপজ্জনক, কারণ এটি বেশিরভাগ সময় কাজ করে এবং যখন তা না করে নিঃশব্দে ব্যর্থ হয়।
octern

0

আপনি লিমিটের সাথে মাইএসকিউএল বিবৃতি ব্যবহার করতে পারেন:

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;

মাইএসকিউএল 5.5.44 এ পরীক্ষিত। সুতরাং, আমরা 18446744073709551615 নম্বর সন্নিবেশ এড়াতে পারি।

দ্রষ্টব্য: লেনদেনটি নিশ্চিত করে যে ভেরিয়েবল @ অ্যাসেটের বিবৃতি কার্যকর করার ক্ষেত্রে বিবেচিত টেবিলের সাথে একমত হয়েছে।


যেমন @ এমএমডি বলেছে: "7
এম

-1

আমি জানি যে এটি পুরানো তবে আমি কোনও অনুরূপ প্রতিক্রিয়া দেখিনি তাই এটিই আমি ব্যবহার করব এমন সমাধান।

প্রথমত, আমি কতগুলি রেকর্ড বিদ্যমান তা দেখতে টেবিলে একটি গণনা কোয়েরি সম্পাদন করব। এই ক্যোয়ারীটি দ্রুত এবং সাধারনত মৃত্যুদন্ডের সময় নগণ্য। কিছুটা এইরকম:

SELECT COUNT(*) FROM table_name;

তারপরে আমি আমার সীমা হিসাবে গণনা থেকে প্রাপ্ত ফলাফলটি ব্যবহার করে আমার ক্যোয়ারী তৈরি করব (যেহেতু সারণীর পক্ষে সারণির সর্বাধিক সারিটি সম্ভবত ফিরে আসতে পারে) number কিছুটা এইরকম:

SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;

বা সম্ভবত এর মতো কিছু:

SELECT * FROM table_name LIMIT desired_offset, count_result;

অবশ্যই, যদি প্রয়োজন হয়, সীমা হিসাবে সরবরাহের জন্য একটি আসল, সঠিক মান পেতে আপনি কাউন্ট_রেসাল্ট থেকে কাঙ্ক্ষিত_অফসেটটি বিয়োগ করতে পারেন। "18446744073709551610" মানটি পাস করা ঠিক ততটাই অর্থপূর্ণ হয় না যদি আমি আসলে সরবরাহের জন্য একটি উপযুক্ত সীমা নির্ধারণ করতে পারি।


2
7 মিটার রেকর্ডের সঙ্গে একটি টেবিলের উপর গণনা (*) নির্বাচন 17s কাছাকাছি লাগে
AMD

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

আইডি আপনার যে কোনও স্ব-সংশোধিত বা অনন্য সংখ্যাসূচক কলাম হতে পারে ...


7
খারাপ ধারণা। আপনি যদি কোনও সারি মুছে ফেলে থাকেন তবে এটি ভুল অফসেটটি দেবে।
octern
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.