মাইএসকিউএলে শেষ সারিটি নির্বাচন করুন


182

আমি কীভাবে SELECTএকটি মাইএসকিউএল টেবিলের শেষ সারিটি করতে পারি ?

আমি INSERTডেটা আইএনএন করছি এবং আমার আগের সারি থেকে একটি কলাম মান পুনরুদ্ধার করা দরকার।

auto_incrementটেবিলে একটি আছে।


7
"শেষ সারি" সংজ্ঞায়িত করুন। সর্বোচ্চ আইডি সহ একটি? নাকি অতি সম্প্রতি যুক্ত হয়েছে?
ইবোমাইক

1
শেষ সারিটি কী নির্দেশ করে - টেবিলে কোনও অটো_স্রোমেন্ট বা DATETIME কলাম রয়েছে?
ওএমজি পনিজ

হ্যাঁ, সেখানে একটি auto_incrementআছে। আমি সর্বাধিক যুক্ত হওয়া একটি চাই।
esqew

9
কোনও সেটে শেষ সারি নেই, যেমনটি ইবোমাইক এবং ওএমজি পনিস জানিয়েছেন। আমি বল পূর্ণ একটি ব্যাগ দিতে এবং শেষ বল আমাকে দিতে বললে আপনি কি করবেন?
ভিনসেন্ট সাভার্ড

উত্তর:


400

হ্যাঁ, সেখানে একটি স্বয়ংক্রিয় সংযোজন আছে

আপনি যদি টেবিলের সমস্ত সারিটির সর্বশেষটি চান, তবে শেষ অবধি MAX(id)এটিই সঠিক উত্তর কোথায় ! ধরনের:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
আমি আশঙ্কা করছি যে কয়েক মিলিয়ন সারি বাছাই করার দরকার থাকলে এটি ধীর হয়ে যায়, তাই না?
স্লওয়া

2
আমি এই 20 মিটারেরও বেশি সারি চালিয়েছি এবং এটি খুব দ্রুত ছিল। আমি ধরে নিয়েছি এই কোয়েরিটি পরিচালনা করার জন্য এক ধরণের বিশেষ কেস রয়েছে। (সম্পাদনা: মাইএসকিউএল 5.7, ইনোডিবি ইঞ্জিন)
ড্যানিয়েল বাকমাস্টার

1
@ পেপকা: আমি এর দ্বারা অর্ডারটি ব্যবহার করতে চাই না, এটি করার জন্য অন্য কোনও বিকল্প আছে কি?
শিব

4
@Slawa যদি না idসূচীবদ্ধ করা হয়।
লর্ন

31

মনে রাখবেন যে সম্পর্কিত ডেটাবেজে টেবিলগুলি কেবল সারিগুলির সেট। এবং গণিতে সেটগুলি আনর্ডারড সংগ্রহ। প্রথম বা শেষ সারি নেই; পূর্ববর্তী সারি বা পরের সারি নেই।

আপনাকে প্রথমে কোনও ক্ষেত্রের দ্বারা আনর্ডার্ড করা সারিগুলির সেটটি বাছাই করতে হবে এবং তারপরে আপনি সংজ্ঞায়িত ক্রমে রেজাল্টসেটের মাধ্যমে পুনরাবৃত্তি মুক্ত করতে পারেন।

যেহেতু আপনার একটি অটো ইনক্রিমেন্টিং ক্ষেত্র রয়েছে, তাই আমি ধরে নিয়েছি যে আপনি এটি বাছাইয়ের ক্ষেত্র হতে চান। সেক্ষেত্রে আপনি নিম্নলিখিতগুলি করতে পারেন:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

দেখুন কীভাবে আমরা প্রথমে অরোর্ডার করা সারিগুলির সেটটি your_auto_increment_fieldসাজানো (যাতে আপনি যা বলেছিলেন) দ্বারা সাজানোর ক্রমে সাজানো হয়। তারপর আমরা সঙ্গে শুধুমাত্র প্রথম সারিতে resultset সীমিত LIMIT 1


25

আপনি @ স্পেসিপিলের দ্বারা প্রস্তাবিত দুটি প্রশ্নের একক ক্যোয়ারিতে একত্রিত করতে পারেন যা দেখতে এরকম দেখাচ্ছে:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

এটি দ্রুত জ্বলন্ত কাজ করা উচিত, তবে INNODB টেবিলগুলিতে এটি অর্ডার + লিমিটের চেয়ে ধীরে ধীরে মিলিসেকেন্ডের ভগ্নাংশ।


@ কার্থিকেইয়ান তার উত্তরটি চার দিন আগে লিখেছিল এবং আমি ডিসেম্বর 2015
ভিজার

না, আমি সম্পাদনা করেছি এবং 4 দিন আগে কিছু বানান সংশোধন করেছি ... পোস্টের তারিখটি 2014 answered Jun 14 at 9:41প্রায় 1 বছর 6 মাস আগের কথা :)
দ্বিজা

শুধু এখানে বায়ু সাফ করার জন্য vzr ঠিক আছে। 'জুন 14' এর অর্থ হচ্ছে জুন 14, ২০১ also এছাড়াও @Karthikeyan এই মুহুর্তে মাত্র দুই মাসের জন্য সদস্য হয়েছে।
রবার্ট ব্রিসিতা

সুসো ... @ কার্তিকেইনের উত্তরটি এর একটি অনুলিপি!
ক্লিফ বার্টন

24

অনেক সারিযুক্ত টেবিলগুলিতে দুটি ক্যোয়ারী সম্ভবত দ্রুততর হয় ...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;

6

এটি সহজভাবে ব্যবহার করুন: PDO::lastInsertId

http://php.net/manual/en/pdo.lastinsertid.php


2
ঠিক। বেশিরভাগ শালীন মাইএসকিউএল ইন্টারফেস লাইব্রেরিতে এর জন্য উত্সর্গীকৃত পদ্ধতি রয়েছে তবে এই প্রশ্নটি পিএইচপি নয় তবে সাধারণ মাইএসকিউএল সিনট্যাক্স।
ভিজার

4

আপনি যদি সর্বাধিক যুক্ত হওয়া চান তবে একটি টাইমস্ট্যাম্প যুক্ত করুন এবং সর্বোচ্চ টাইমস্ট্যাম্পের মাধ্যমে বিপরীত ক্রমে অর্ডার করুন নির্বাচন করুন, সীমা 1। আপনি যদি আইডিতে যেতে চান তবে আইডির মাধ্যমে বাছাই করুন। আপনি কেবলমাত্র যুক্ত হওয়াটি যদি ব্যবহার করতে চান তবে ব্যবহার করুন mysql_insert_id


4

প্রায় প্রতিটি ডাটাবেস সারণীতে একটি অটো_সংশোধন কলাম থাকে (সাধারণত আইডি)

আপনি যদি টেবিলের সমস্ত সারিগুলির শেষটি চান,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

অথবা

আপনি দুটি ক্যোয়ারী একক ক্যোয়ারিতে একত্রিত করতে পারেন যা দেখতে এরকম দেখাচ্ছে:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);

ডিবিএ (বা যিনি টেবিলটি তৈরি করেছেন) স্বয়ংক্রিয় বর্ধিতকরণগুলি প্রয়োগ করেন তবে অটো
বর্ধিততা কেবল সেখানেই থাকবে

2
SELECT * FROM adds where id=(select max(id) from adds);

এই কোয়েরিটি আপনার টেবিলের সর্বশেষ রেকর্ডটি আনতে ব্যবহৃত হয়েছিল।


নীচের উত্তরের অনুলিপি
Jbur43

2

এখানে অনেক উত্তর একই বলে (আপনার অটো ইনক্রিমেন্টের অর্ডার), যা ঠিক আছে, তবে আপনার যদি সূচিযুক্ত একটি স্বয়ংস্ক্রিখিত কলাম থাকে।

সাইড নোটে, আপনার যদি এমন ক্ষেত্র থাকে এবং এটি প্রাথমিক কী হয় তবে order byবনাম ব্যবহারের জন্য কোনও পারফরম্যান্স জরিমানা নেই select max(id)। প্রাথমিক কীটি হ'ল ডেটাবেস ফাইলগুলিতে কীভাবে ডেটা অর্ডার করা হয় (অন্তত InnoDB এর জন্য), এবং আরডিবিএমএস জানে যে ডেটাটি কোথায় শেষ হয় এবং এটি order by id + limit 1পৌঁছানোর মতোই হতে পারেmax(id)

এখন যখন অল্প স্বল্প সংখ্যক প্রাথমিক কী আপনার কাছে নেই তখন রাস্তাটি কম ভ্রমণ করা হয়। হতে পারে প্রাথমিক কীটি একটি প্রাকৃতিক কী, যা 3 টি ক্ষেত্রের সংমিশ্রণ ... যদিও সব হারিয়ে যায় না। প্রোগ্রামিং ভাষা থেকে আপনি প্রথমে সারিগুলির সংখ্যা পেতে পারেন

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

এবং তারপরে এই LIMITধারাটিতে প্রাপ্ত নম্বরটি ব্যবহার করুন

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

দুর্ভাগ্যক্রমে, মাইএসকিউএল একটি LIMITঅনুচ্ছেদে সাব-কোয়েরি, বা ক্লজটিতে ব্যবহারকারীর ভেরিয়েবলের অনুমতি দেবে না


1

আপনি OFFSETএকটি LIMITকমান্ডে একটি ব্যবহার করতে পারেন :

SELECT * FROM aTable LIMIT 1 OFFSET 99

যদি আপনার টেবিলটিতে 100 টি সারি থাকে তবে এটি কোনও প্রাথমিক_কিকে নির্ভর না করে শেষ সারিতে ফিরে আসে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.