প্রতিটি গ্রুপ থেকে শীর্ষ ২ সারি নির্বাচন করতে WHERE কন্ডিশন সহ সাবকোয়েরি ব্যবহার করতে হয়। একটি টেবিল তৈরি করা যাক। টেবিল তৈরির কোয়েরি:
mysql> create table selectTop2FromEachGroup
-> (
-> Name varchar(20),
-> TotalScores int
-> ); Query OK, 0 rows affected (0.80 sec)
ইনসার্ট কমান্ড দিয়ে কিছু রেকর্ড ইনসার্ট করা যাক। কোয়েরিটি হলো:
mysql> insert into selectTop2FromEachGroup values('John',32); Query OK, 1 row affected (0.38 sec) mysql> insert into selectTop2FromEachGroup values('John',33); Query OK, 1 row affected (0.21 sec) mysql> insert into selectTop2FromEachGroup values('John',34); Query OK, 1 row affected (0.17 sec) mysql> insert into selectTop2FromEachGroup values('Carol',35); Query OK, 1 row affected (0.17 sec) mysql> insert into selectTop2FromEachGroup values('Carol',36); Query OK, 1 row affected (0.14 sec) mysql> insert into selectTop2FromEachGroup values('Carol',37); Query OK, 1 row affected (0.15 sec)
সিলেক্ট স্টেটমেন্ট দিয়ে সব রেকর্ড দেখানো যাক। কোয়েরিটি হলো:
mysql> select *from selectTop2FromEachGroup;
আউটপুট নিচে দেওয়া হলো:
+-------+-------------+ | Name | TotalScores | +-------+-------------+ | John | 32 | | John | 33 | | John | 34 | | Carol | 35 | | Carol | 36 | | Carol | 37 | +-------+-------------+ 6 rows in set (0.00 sec)
WHERE কন্ডিশন এবং সাবকোয়েরি ব্যবহার করে প্রতিটি গ্রুপ থেকে শীর্ষ ২ সারি নির্বাচন করার কোয়েরি নিচে দেওয়া হলো:
mysql> select *from selectTop2FromEachGroup tbl
-> where
-> (
-> SELECT COUNT(*)
-> FROM selectTop2FromEachGroup tbl1
-> WHERE tbl1.Name = tbl.Name AND
-> tbl1.TotalScores >= tbl.TotalScores
-> ) <= 2 ;
আউটপুট নিচে দেওয়া হলো:
+-------+-------------+ | Name | TotalScores | +-------+-------------+ | John | 33 | | John | 34 | | Carol | 36 | | Carol | 37 | +-------+-------------+ 4 rows in set (0.06 sec)
ব্যাখ্যা: সাবকোয়েরিটি প্রতিটি সারির জন্য সেই গ্রুপে (এখানে Name অনুযায়ী) কতগুলো সারি আছে যার TotalScores বড় বা সমান, তা গণনা করে। যদি গণনা ২ বা তার কম হয়, তবে সেই সারিটি সিলেক্ট হয়। এই পদ্ধতিতে উইন্ডো ফাংশন (যেমন ROW_NUMBER()) ছাড়াই প্রতিটি গ্রুপ থেকে টপ-এন সারি বের করা যায়। MySQL 8.0+ এ ROW_NUMBER() OVER (PARTITION BY Name ORDER BY TotalScores DESC) ব্যবহার করে আরও সহজে করা যায়।