Sorting Data

Mysql Sorting Data

MySQL এর Query তে Sorting Data কি?

একটি MySQL ক্যোয়ারীতে ডেটা Sorting করা মানে এক বা একাধিক কলামের উপর ভিত্তি করে একটি নির্দিষ্ট অর্ডারে বা ক্রমে ফলাফল সেট সাজানো। ডিফল্টরূপে, যখন আপনি একটি SELECT statement ব্যবহার করে একটি MySQL টেবিল থেকে ডেটা আনেন, রিটার্নকৃত রো গুলির Order বা ক্রম সামঞ্জস্যপূর্ণ নাও হতে পারে। আর এই রো গুলির Order ঠিক রাখতে, আপনাকে ক্যোয়ারীতে ORDER BY ক্লজ ব্যবহার করতে হবে , আপনি এমন একটি বা একাধিক নির্দিষ্ঠ কলাম(গুলি) নির্দিষ্ট করতে পারেন যা ডেটা Sorting বা সাজানোর জন্য ব্যবহার করা উচিত, হয় ascending (ASC) বা descending (DESC) অর্ডারে ।

এই পর্বে, আমরা জানব কিভাবে একটি টেবিল থেকে ডেটা কোয়েরি পাশাপাশি ডেটা কে Sorting করতে হয় এবং MySQL SELECT statement এর পাশাপাশি ORDER BY statement ব্যবহার করতে হয়। তবে তার আগে এই পোস্টের সবগুলো উদাহরণ প্র্যাক্টিস করার জন্য আপনাকে এই Sample Database Schema টি ডাউনলোড করতে হবে এবং আপনার MySQL ডাটাবেজে ইম্পোর্ট করতে হবে।

ORDER BY ক্লজ সহ একটি MySQL কোয়েরির মৌলিক সিনট্যাক্স নিম্নরূপ:

SELECT 
   select_list
FROM 
   table_name
ORDER BY 
   column1 [ASC|DESC], 
   column2 [ASC|DESC],
   ...;

MySQL কোয়েরির প্রতিটি অংশের বিস্তারিত এখানে দেওয়া হলো :

  • SELECT: টেবিল থেকে আপনি যে কলামগুলি পুনরুদ্ধার করতে চান তা নির্দিষ্ট করে।
  • FROM: টেবিলের নাম নির্দেশ করে যেখান থেকে ডেটা আনা উচিত।
  • ORDER BY: এই ক্লজটি কলামগুলি নির্দিষ্ট করতে ব্যবহৃত হয় যার ভিত্তিতে আপনি ফলাফল সেটটি sorting অর্থাৎ সাজাতে চান।
  • column1, column2, …: এই কলামগুলি আপনি সাজানোর জন্য ব্যবহার করতে চান। আপনি কমা দ্বারা পৃথক করা এক বা একাধিক কলাম ব্যবহার করতে পারেন।
  • ASC|DESC: ঐচ্ছিক কীওয়ার্ড ASC হল ascending order (সবচেয়ে ছোট থেকে বৃহত্তম), যখন DESC হল descending order (সবচেয়ে বড় থেকে ছোট)। আপনি যদি এই কীওয়ার্ডটি বাদ দেন, ASC কে ডিফল্ট অর্ডার হিসেবে ধরে নেওয়া হবে।

MySQL ORDER BY examples

আমরা demonstration এর জন্য sample database থেকে customers টেবিল ব্যবহার করব।

customers table for sorting data

A) MySQL ORDER BY clause ব্যবহার করে একটি Column কে ভিত্তি করে Sorting

নিম্নোক্ত query টি ORDER BY ক্লজ ব্যবহার করে customers দের তাদের শেষ নাম অনুসারে ascending অর্ডারে সাজাতে:

SELECT
	contactLastname,
	contactFirstname
FROM
	customers
ORDER BY
	contactLastname;

Output:

+-----------------+------------------+
| contactLastname | contactFirstname |
+-----------------+------------------+
| Accorti         | Paolo            |
| Altagar,G M     | Raanan           |
| Andersen        | Mel              |
| Anton           | Carmen           |
| Ashworth        | Rachel           |
| Barajas         | Miguel           |
...

আবার আপনি যদি customers দের last name অনুসারে sort করতে চান তাহলে নিচের ক্যোয়ারীতে দেখানো হিসাবে ORDER BY ক্লজে contactLastname কলামের পরে DESC ব্যবহার করুন:

SELECT
	contactLastname,
	contactFirstname
FROM
	customers
ORDER BY
	contactLastname DESC;

Ouptut:

+-----------------+------------------+
| contactLastname | contactFirstname |
+-----------------+------------------+
| Young           | Jeff             |
| Young           | Julie            |
| Young           | Mary             |
| Young           | Dorothy          |
| Yoshido         | Juri             |
| Walker          | Brydey           |
| Victorino       | Wendy            |
| Urs             | Braun            |
| Tseng           | Jerry            |
....

B) MySQL ORDER BY clause ব্যবহার করে একাধিক Column কে ভিত্তি করে Sorting

আপনি যদি customers দের last name অনুসারে descending order এবং তারপর ascending order এ first name অনুসারে বাছাই করতে চান, আপনি নিম্নোক্তভাবে এই নিজ নিজ কলামে DESC এবং ASC উভয়ই নির্দিষ্ট করতে পারেন :

SELECT 
    contactLastname, 
    contactFirstname
FROM
    customers
ORDER BY 
	contactLastname DESC , 
	contactFirstname ASC;

Output:

+-----------------+------------------+
| contactLastname | contactFirstname |
+-----------------+------------------+
| Young           | Dorothy          |
| Young           | Jeff             |
| Young           | Julie            |
| Young           | Mary             |
| Yoshido         | Juri             |
| Walker          | Brydey           |
| Victorino       | Wendy            |
| Urs             | Braun            |
| Tseng           | Jerry            |
| Tonini          | Daniel           |

এই উদাহরণে, ORDER BY ক্লজ last name দ্বারা সেট করা ফলাফলকে প্রথমে descending order এ সাজায় এবং তারপর চূড়ান্ত ফলাফল সেট করতে ascending order এ first name দ্বারা সেট করা ফাইনাল ফলাফলকে সাজায়।

C) একটি expression উদাহরণ দ্বারা সেট করা ফলাফল Sorting করার জন্য MySQL ORDER BY clause ব্যবহার

আমাদের দেওয়া sample database থেকে নিম্নলিখিত orderdetails টেবিল দেখুন.

order details table

নিম্নলিখিত ক্যোয়ারী orderdetails টেবিল থেকে অর্ডার লাইন আইটেম নির্বাচন করে। এটি প্রতিটি লাইন আইটেমের জন্য সাবটোটাল গণনা করে এবং সাবটোটালের উপর ভিত্তি করে ফলাফল সেট সাজায়।

SELECT 
    orderNumber, 
    orderlinenumber, 
    quantityOrdered * priceEach
FROM
    orderdetails
ORDER BY 
   quantityOrdered * priceEach DESC;
+-------------+-----------------+-----------------------------+
| orderNumber | orderlinenumber | quantityOrdered * priceEach |
+-------------+-----------------+-----------------------------+
|       10403 |               9 |                    11503.14 |
|       10405 |               5 |                    11170.52 |
|       10407 |               2 |                    10723.60 |
|       10404 |               3 |                    10460.16 |
|       10312 |               3 |                    10286.40 |
...

ক্যোয়ারীটিকে আরও readable করতে, আপনি SELECT ক্লজে একটি column alias expression বরাদ্দ এসাইন করতে পারেন এবং নিম্নলিখিত ক্যোয়ারীতে দেখানো হিসাবে ORDER BY ক্লজে সেই column alias ব্যবহার করতে পারেন:

SELECT 
    orderNumber,
    orderLineNumber,
    quantityOrdered * priceEach AS subtotal
FROM
    orderdetails
ORDER BY subtotal DESC;
+-------------+-----------------+----------+
| orderNumber | orderLineNumber | subtotal |
+-------------+-----------------+----------+
|       10403 |               9 | 11503.14 |
|       10405 |               5 | 11170.52 |
|       10407 |               2 | 10723.60 |
|       10404 |               3 | 10460.16 |
|       10312 |               3 | 10286.40 |
|       10424 |               6 | 10072.00 |
|       10348 |               8 |  9974.40 |
|       10405 |               3 |  9712.04 |
|       10196 |               5 |  9571.08 |
|       10206 |               6 |  9568.73 |
 ...

এই উদাহরণে, আমরা quantityOrdered * priceEach এক্সপ্রেশনের জন্য column alias হিসাবে subtotal ব্যবহার করি এবং subtotal alias দ্বারা সেট করা ফলাফলকে সাজাই।

যেহেতু MySQL ORDER BY ক্লজের আগে SELECT ক্লজের মূল্যায়ন করে, তাই আপনি ORDER BY ক্লজের SELECT ক্লজে উল্লেখ করা column alias ব্যবহার করতে পারেন।

Custom list ব্যবহার করে ডেটা sort করার জন্য MySQL ORDER BY ক্লজ এর ব্যবহার

Custom list ব্যবহার করে ডেটা sort করার জন্য MySQL ORDER BY ক্লজ এর ব্যবহার করার জন্য আপনাকে FIELD() ফাঙ্কশন ব্যবহার করতে হবে। FIELD() ফাংশনের সিনট্যাক্স নিম্নরুপঃ

FIELD(str, str1, str2, ...)

FIELD() ফাংশন str1, str2, … লিস্টের str এর অবস্থান প্রদান করে। যদি str লিস্টে না থাকে, FIELD() ফাংশনটি 0 প্রদান করে। উদাহরণস্বরূপ, নিম্নলিখিত ক্যোয়ারীটি 1 প্রদান করে কারণ স্ট্রিং ‘A’ এর অবস্থান তালিকার প্রথম অবস্থান ‘A’, ‘B’ এবং ‘সি’:

SELECT FIELD('A', 'A', 'B','C');

Output:

+--------------------------+
| FIELD('A', 'A', 'B','C') |
+--------------------------+
|                        1 |
+--------------------------+
1 row in set (0.00 sec)

এবার নিম্নলিখিত উদাহরণে আপনাকে রেজাল্ট 2 প্রদান করবে :

SELECT FIELD('B', 'A','B','C');

Output:

+-------------------------+
| FIELD('B', 'A','B','C') |
+-------------------------+
|                       2 |
+-------------------------+
1 row in set (0.00 sec)

আরো একটি বাস্তব উদাহরণ নেওয়া যাক।

sample database থেকে নিম্নলিখিত অর্ডার টেবিল দেখুন.

orders table

ধরুন আপনি নিম্নলিখিত অর্ডারে তাদের অবস্থার উপর ভিত্তি করে বিক্রয় আদেশগুলি sort বা সাজাতে চান:

  • In Process
  • On Hold
  • Canceled
  • Resolved
  • Disputed
  • Shipped

এটি করার জন্য, আপনি FIELD() ফাংশনটি ব্যবহার করে প্রতিটি অর্ডার স্ট্যাটাস একটি সংখ্যায় ম্যাপ করতে পারেন এবং FIELD() ফাংশনের ফলাফল অনুসারে ফলাফল সাজাতে পারেন:

SELECT 
    orderNumber, status
FROM
    orders
ORDER BY FIELD(status,
        'In Process',
        'On Hold',
        'Cancelled',
        'Resolved',
        'Disputed',
        'Shipped');
+-------------+------------+
| orderNumber | status     |
+-------------+------------+
|       10425 | In Process |
|       10421 | In Process |
|       10422 | In Process |
|       10420 | In Process |
|       10424 | In Process |
|       10423 | In Process |
|       10414 | On Hold    |
|       10401 | On Hold    |
|       10334 | On Hold    |
|       10407 | On Hold    |
...

MySQL ORDER BY এবং NULL এর ব্যবহার

MySQL-এ NULL value গুলো non-NULL value গুলোর আগে আসে। অতএব, আপনি যখন ASC option এর সাথে ORDER BY ক্লজ করেন, তখন ফলাফল সেটে NULLগুলি প্রথমে উপস্থিত হয়।

উদাহরণ স্বরূপ, reportsTo কলামে মান অনুসারে employees দের sort করার জন্য নিম্নলিখিত ক্যোয়ারীটি ORDER BY ধারা ব্যবহার করতে পারেন :

SELECT 
    firstName, lastName, reportsTo
FROM
    employees
ORDER BY reportsTo;

Output:

+-----------+-----------+-----------+
| firstName | lastName  | reportsTo |
+-----------+-----------+-----------+
| Diane     | Murphy    |      NULL |
| Mary      | Patterson |      1002 |
| Jeff      | Firrelli  |      1002 |
| William   | Patterson |      1056 |
| Gerard    | Bondur    |      1056 |
...

তবে, আপনি যদি DESC option এর সাথে ORDER BY ব্যবহার করেন, তাহলে ফলাফল সেটে NULL value গুলো শেষ দেখাবে। উদাহরণ স্বরূপ:

SELECT 
    firstName, lastName, reportsTo
FROM
    employees
ORDER BY reportsTo DESC;
Output:

+-----------+-----------+-----------+
| firstName | lastName  | reportsTo |
+-----------+-----------+-----------+
| Yoshimi   | Kato      |      1621 |
| Leslie    | Jennings  |      1143 |
| Leslie    | Thompson  |      1143 |
| Julie     | Firrelli  |      1143 |
| ....
| Mami      | Nishi     |      1056 |
| Mary      | Patterson |      1002 |
| Jeff      | Firrelli  |      1002 |
| Diane     | Murphy    |      NULL |
+-----------+-----------+-----------+
23 rows in set (0.00 sec)

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply