परिचय
जब आपको प्रत्येक समूह (जैसे प्रत्येक छात्र) के लिए न्यूनतम मान वाली पंक्तियां चाहिए, तो सबक्वेरी के साथ MIN() एग्रीगेट फंक्शन का उपयोग किया जा सकता है।
उदाहरण: टेबल बनाना और डेटा डालना
mysql> CREATE TABLE DemoTable (
-> Name VARCHAR(20),
-> Score INT
-> );
Query OK, 0 rows affected (0.56 sec)
mysql> INSERT INTO DemoTable VALUES('John', 56);
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DemoTable VALUES('John', 45);
Query OK, 1 row affected (0.24 sec)
mysql> INSERT INTO DemoTable VALUES('John', 58);
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable VALUES('Chris', 43);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable VALUES('Chris', 38);
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable VALUES('Chris', 87);
Query OK, 1 row affected (0.14 sec)
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable;
आउटपुट:
+-------+-------+
| Name | Score |
+-------+-------+
| John | 56 |
| John | 45 |
| John | 58 |
| Chris | 43 |
| Chris | 38 |
| Chris | 87 |
+-------+-------+
6 rows in set (0.00 sec)
प्रत्येक नाम के लिए न्यूनतम स्कोर वाली पंक्तियां प्राप्त करने की क्वेरी
mysql> SELECT * FROM DemoTable tbl1
-> WHERE Score IN (
-> SELECT MIN(Score) FROM DemoTable tbl2 WHERE tbl1.Name = tbl2.Name
-> );
परिणाम
+-------+-------+
| Name | Score |
+-------+-------+
| John | 45 |
| Chris | 38 |
+-------+-------+
2 rows in set (0.00 sec)
व्याख्या
tbl1औरtbl2एक ही टेबल के उपनाम- सबक्वेरी: प्रत्येक tbl1.Name के लिए, tbl2 में उसी नाम का न्यूनतम स्कोर ढूंढता है
WHERE Score IN (...)- मुख्य क्वेरी उन पंक्तियों को चुनती है जिनका स्कोर सबक्वेरी परिणाम से मेल खाता है- सहसंबद्ध सबक्वेरी (correlated subquery): बाहरी क्वेरी के प्रत्येक पंक्ति के लिए आंतरिक क्वेरी चलती है
बेहतर विकल्प: JOIN के साथ (अधिक कुशल)
SELECT t1.* FROM DemoTable t1
JOIN (
SELECT Name, MIN(Score) AS min_score FROM DemoTable GROUP BY Name
) t2 ON t1.Name = t2.Name AND t1.Score = t2.min_score;
MySQL 8.0+: विंडो फंक्शन
SELECT Name, Score FROM (
SELECT Name, Score,
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Score ASC) AS rn
FROM DemoTable
) t WHERE rn = 1;
नोट
यदि एक नाम के लिए एकाधिक पंक्तियों में समान न्यूनतम स्कोर हो, तो सभी लौटाई जाएंगी। केवल एक पंक्ति प्रति समूह के लिए ROW_NUMBER() या LIMIT 1 प्रति समूह (MySQL 8.0 में मुश्किल) उपयोग करें।