প্রথমে নির্দিষ্ট ক্ষেত্রের মান অনুসারে অর্ডার করা


92

আমার কাছে 3 টি কলাম সহ একটি টেবিল রয়েছে:

id | name | priority
--------------------
 1 | core  |   10
 2 | core  |   9
 3 | other |   8
 4 | board |   7
 5 | board |   6
 6 | core  |   4

আমি ফলাফল সেটটি ব্যবহার করে অর্ডার করতে চাই priorityতবে প্রথমে সেই সারিগুলিতে name=coreকম অগ্রাধিকার থাকলেও। ফলাফলটি দেখতে এমন হওয়া উচিত

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8

উত্তর:


160

এর রয়েছে মাইএসকিউএল FIELDফাংশন

আপনি যদি সমস্ত সম্ভাব্য মানের জন্য সম্পূর্ণ বাছাই করতে চান:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")

যদি আপনি কেবল যত্নশীল হন যে "মূল" প্রথম এবং অন্য মানগুলি কিছু যায় আসে না:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC

আপনি যদি প্রথমে "কোর" অনুসারে বাছাই করতে চান এবং অন্যান্য ক্ষেত্রগুলিকে সাধারণ বাছাই অনুসারে:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority

যদিও এখানে কিছু সাবধানবাণী রয়েছে:

প্রথমত, আমি নিশ্চিত যে এটি মাইএসকিএল-কেবল কার্যকারিতা - প্রশ্নটি মাইএসকিএল ট্যাগ করা হয়, তবে আপনি কখনই জানেন না।

দ্বিতীয়ত, কীভাবে FIELD()কাজ করে সেদিকে মনোযোগ দিন : এটি মানের এক-ভিত্তিক সূচকটি প্রদান করে - FIELD(priority, "core")"কোর" মান হলে এটি 1 প্রদান করবে। যদি ক্ষেত্রের মান তালিকায় না থাকে তবে এটি শূন্য ফিরে আসে । এই কেন DESC, যদি না আপনি সব সম্ভাব্য মান উল্লেখ প্রয়োজন।


4
প্রায় 5 বছর পরে আমি এইটির গ্রহণযোগ্য উত্তর পরিবর্তন করেছি কারণ এটি পরিষ্কার এবং দ্রুত।
ওমিড

ডিবি 2 সমতুল্য?
সাইবারমোনক

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

@ জয়ন্তসুবর্ণ: মাইএসকিউএল ফিল্ড () ডক্সের দিকে তাকিয়ে আমি নিশ্চিত যে এটিকে সাবস্ট্রিং হিসাবে মূল্যায়নের কোনও উপায় নেই, কারণ প্রতিটি যুক্তিই একরকম স্ট্রিং হতে হবে। কিছু স্ট্রিং ম্যানিপুলেশন ফাংশন থাকতে পারে যা সহায়তা করতে পারে তবে আমি নিশ্চিত নই।
Nerdmaster

ধন্যবাদ বন্ধু. আপনি আমার দিন তৈরি করেছেন।
BEingprabhU

92

সাধারণত আপনি করতে পারেন

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 

বিশেষত মাইএসকিউএল এ আপনিও করতে পারেন

select * from your_table
order by name <> 'core',
         priority 

যেহেতু মাইএসকিউএল একটি comparision ফল হয় 0বা 1এবং আপনি সেই ফলাফলের এটি অনুসারে বাছাইয়ের পারবেন না।


4
এখানে 1এবং কি 2মানে?
নিরাজ চৌহান

4
আমি প্রায় 3000 সারি বাছাই করতে এসেছি। আমার ক্ষেত্রে উপর @ আইমান-Hourieh সমাধান stackoverflow.com/questions/958627/... সময় এই সমাধান তুলনায় অর্ধেক সময় লাগে।
নাইটলিপ

@ নাইটলাইপ: ভালো কেবল একটি নোট: দ্রুত সমাধানটি মাইএসকিউএল-নির্দিষ্ট।
21 জুলাই এ 21 জুলাই এয়ারজেন ডি

1এবং 2ডেটা বাছাই করতে আমি কেবল 2 নম্বর ব্যবহার করি। হতে পারে 3এবং 4বা অন্য কিছু।
জুয়েরজেন

কি আছে যখন সম্পর্কে %মধ্যে WHEREদফা? পছন্দ . . . WHERE name LIKE '%sth%' . . .? stackoverflow.com/questions/41303379/…
স্ট্যাক করুন

6

নির্দিষ্ট সারিগুলিকে অগ্রাধিকার দেওয়ার একটি উপায় হ'ল তাদের অগ্রাধিকারে একটি বৃহত সংখ্যক যুক্ত করা। আপনি একটি CASEবিবৃতি দিয়ে এটি করতে পারেন :

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc

ডেমো: http://www.sqlfiddle.com/#!2/753ee/1




1
SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')

4
যদিও আপনার কোডটি এই প্রশ্নের উত্তর হতে পারে তবে এ সম্পর্কে কিছু ব্যাখ্যা দেওয়া ভাল।
মেহরবান

0

এটা কর:

SELECT * FROM table ORDER BY column `name`+0 ASC

+0 যোগ করার অর্থ হ'ল:

0, 10, 11, 2, 3, 4

হয়ে:

0, 2, 3, 4, 10, 11

এই কৌশলটি একটি স্ট্রিংকে একটি সংখ্যায় পরিণত করার জন্য। এটি ওপির প্রশ্নের সমাধান করে না। (তবে, এর ডেটাটাইপ না দেখে, এটি সম্পূর্ণ সমাধানের অংশ হওয়া উচিতpriority কিনা তা আমি বলতে পারি না ।)
রিক জেমস

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