মাইএসকিউএলে কাস্টম অর্ডার বাই অর্ডার কীভাবে সংজ্ঞায়িত করবেন


143

মাইএসকিউএলে আমি কীভাবে একটি কাস্টম বাছাইয়ের অর্ডার সংজ্ঞায়িত করব।

আমি এই টেবিলটি কী বিবেচনা করতে চাই তা বোঝানোর চেষ্টা করার জন্য:

ID  Language    Text
0   ENU         a
0   JPN         b
0   DAN         c       
1   ENU         d
1   JPN         e
1   DAN         f
2   etc...

এখানে আমি ভাষা এবং আরোহী আইডি অনুসারে বাছাই করা সমস্ত সারি ফেরত দিতে চাই যাতে ভাষা = ENU প্রথমে আসে, তারপরে JPN এবং শেষ অবধি DAN।

ফলাফলটি হওয়া উচিত: ক, ডি, বি, ই, সি, এফ ইত্যাদি

এটা কি সম্ভব?

উত্তর:


276

মাইএসকিউএলের একটি হ্যান্ডি ফাংশন রয়েছে FIELD()যা এই জাতীয় কাজের জন্য দুর্দান্ত।

ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID

তবে নোট করুন

  1. এটি আপনার এসকিউএলকে কম পোর্টেবল করে তোলে, কারণ অন্যান্য ডিবিএমএসগুলিতে এ জাতীয় ফাংশন নাও থাকতে পারে

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


3
ধন্যবাদ এটি আমার অবস্থার জন্য পুরোপুরি যেখানে আমাকে কেবল দুটি মান দিয়ে অর্ডার করতে হবে (একটি প্রাথমিক ভাষা, উদাহরণস্বরূপ জেপিএন, এবং একটি ফ্যালব্যাক ভাষা, উদাহরণস্বরূপ ENU)।
মোলসকিনার

4
মানুষ আপনি সবেমাত্র আমাকে ম্যাজেন্টোতে পুনর্লিখনটি সংরক্ষণ করেছেন :)
এরিক সিমোনিক

1
যদি আপনার GROUP BYআগে থাকে? উদাহরণস্বরূপ, আমি চাই প্রথম মানটি শেষে প্রদর্শিত হবে?
প্যাথ্রোস

GROUP BYএকটি সাবকিউরিতে কোয়েরিটি রাখুন এবং এটি বাইরের ক্যোয়ারিতে অর্ডার করুন
এমচএল


53

যদি সেগুলি কেবলমাত্র তিনটি মান হয় তবে আপনি একটি CASEএক্সপ্রেশন ব্যবহার করতে পারেন :

ORDER BY `ID`,
         CASE `Language`
         WHEN 'ENU' THEN 1
         WHEN 'JPN' THEN 2
         WHEN 'DAN' THEN 3
         END

(যদি অন্য মান থাকতে পারে তবে ক্রমকে ক্রমাগত রাখতে আপনি কিছু অতিরিক্ত যুক্তি যুক্ত করতে চাইতে পারেন, উদাহরণস্বরূপ, আপনি ELSE 4এই CASEঅভিব্যক্তিটি যুক্ত করতে পারেন এবং তারপরে Languageতৃতীয় ক্রম মাপদণ্ড হিসাবে নিজেই আদেশ করুন:

ORDER BY `ID`,
         CASE `Language`
         WHEN 'ENU' THEN 1
         WHEN 'JPN' THEN 2
         WHEN 'DAN' THEN 3
         ELSE 4
         END,
         `Language`

)


1
এবং যদি আপনি একটি পৃথক টেবিল প্রতিটি ভাষার প্লাস একটি সাজানোর ক্রম কলাম এবং যে লিংক সংরক্ষণ হতে পারে যদি সেখানে অনেক ভাষা মান
kaj

1
এটি প্রথমে আইডি দিয়ে অর্ডার করবে, ফলস্বরূপ, বি, সি, ডি, ই, এফ
পাইওটর্ম

ধন্যবাদ এই পুরোপুরি কাজ করে - যেমন Mchl উত্তর যা আমি যেমন সহজ দেখায় গৃহীত করেনি
Muleskinner

19

আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে, প্রথমটি হল ভাষাটিকে ENUM হিসাবে পরিবর্তন করা (এটি সম্ভব বলে ধরে নিচ্ছেন এবং আপনি কেবল কয়েকটি পরিবর্তনের আশা করছেন)

আপনি এটা উল্লেখ করেন যেমন ENUM('ENU','JPN','DAN')তারপর ORDER Language ASCঅর্ডার আপনাকে তা নির্দিষ্ট মধ্যে অর্ডার হবে।

দ্বিতীয়টি কোথাও একটি মামলা জড়িত করবে, অর্থাত্‍

SELECT * FROM table
ORDER BY CASE Language
    WHEN 'ENU' THEN 3
    WHEN 'JPN' THEN 2
    WHEN 'DAN' THEN 1
    ELSE 0
END DESC, ID ASC

পারফরম্যান্স-ভিত্তিক ENUM পদ্ধতিটি দ্রুত ফলাফলগুলি ফিরিয়ে দেবে, তবে আপনাকে আরও ভাষা যুক্ত করতে চাইলে আরও ঝামেলা হবে। তৃতীয় বিকল্পটি হ'ল ভাষাগুলির জন্য একটি সাধারণকরণের টেবিল যুক্ত করা যাইহোক এই সংস্করণে ওভারকিল হতে পারে।


ঠিক কোথায় টাইপ করবেন ENUM('ENU','JPN','DAN')?
প্যাথ্রোস

1
টেবিলের সংজ্ঞায় @ পাথ্রোস, আপনি এটিকে ভিআচআরএআর ইত্যাদির পরিবর্তে একটি এনইউএম হিসাবে উল্লেখ করেছেন Intern অভ্যন্তরীণভাবে মাইএসকিউএল ENUM বিকল্পগুলি একটি নির্দিষ্ট ক্রমে সংরক্ষণ করে এবং সেগুলি সূচক করে, এবং তাই বিশেষত একটি ENUM কলাম দ্বারা আদেশ করার সময় এটি অভ্যন্তরের সূচকটি পরিবর্তে ব্যবহার করবে স্ট্রিং মানগুলি (CAST (যদি না এটি আবার কোনও VARCHAR এ তৈরি করতে ব্যবহৃত হয়)
সাইমন আমার মাই স্কুল পোর্টালে

না করা উচিত END DESC,হবে END CASE DESC,?
ইসতিয়াক আহমেদ

নাঃ। সকলের CASEপ্রয়োজন নেই END CASE, এটি প্রসঙ্গে নির্ভর। প্রসেসিউডেরCASE মধ্যে END CASE( dev.mysql.com/doc/refman/5.5/en/case.html ) প্রয়োজন তবে CASESELECT এর মধ্যে END CASEকেবল END( dev.mysql.com/doc/refman/5.7/en/… ) প্রয়োজন হয় না - এতে প্রসঙ্গ এটি একটি নিয়ন্ত্রণ প্রবাহ ফাংশন।
সাইমন আমার স্কুল পোর্টালে

1

Yii2 ফ্রেমওয়ার্কের জন্য আমরা অনুসরণের পদ্ধতিটি অনুসরণ করি achieve

Project::find()
->orderBy([new Expression('FIELD(pid_is_t_m,2,0,1)'),'task_last_work'=> SORT_ASC])
->all();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.