MySQL में GROUP BY और MAX() का उपयोग करके प्रति समूह नवीनतम रिकॉर्ड प्राप्त करना
किसी कॉलम द्वारा ग्रुपिंग करके प्रत्येक समूह का नवीनतम (अधिकतम) टाइमस्टैम्प या मान प्राप्त करने के लिए GROUP BY के साथ MAX() एग्रीगेट फ़ंक्शन का उपयोग करें।
उदाहरण के साथ पूर्ण कार्यान्वयन
टेबल बनाना
mysql> CREATE TABLE DemoTable621 (
UserName VARCHAR(100),
UserEmailId VARCHAR(100),
UserLastPost DATETIME
);
रिकॉर्ड डालना (एक ही उपयोगकर्ता के एकाधिक पोस्ट)
mysql> INSERT INTO DemoTable621 VALUES
('John', 'John@gmail.com', '2019-04-10 11:01:10'),
('John', 'John@gmail.com', '2019-07-14 13:07:10');
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable621;
आउटपुट:
+----------+----------------+---------------------+
| UserName | UserEmailId | UserLastPost |
+----------+----------------+---------------------+
| John | John@gmail.com | 2019-04-10 11:01:10 |
| John | John@gmail.com | 2019-07-14 13:07:10 |
+----------+----------------+---------------------+
2 rows in set (0.00 sec)
GROUP BY के साथ नवीनतम पोस्ट प्राप्त करना
mysql> SELECT UserName, UserEmailId, MAX(UserLastPost)
FROM DemoTable621
GROUP BY UserName, UserEmailId;
आउटपुट:
+----------+----------------+---------------------+
| UserName | UserEmailId | max(UserLastPost) |
+----------+----------------+---------------------+
| John | John@gmail.com | 2019-07-14 13:07:10 |
+----------+----------------+---------------------+
1 row in set (0.19 sec)
मुख्य बिंदु:
GROUP BY UserName, UserEmailId- दोनों कॉलम द्वारा समूह (क्योंकि दोनों SELECT में हैं)MAX(UserLastPost)- प्रत्येक समूह में अधिकतम (नवीनतम) datetime- MySQL केवल
ONLY_FULL_GROUP_BYमोड में SELECT सूची के सभी गैर-एग्रीगेट कॉलम GROUP BY में मांगता है
पूरी पंक्ति प्राप्त करने के लिए (न केवल MAX तारीख)
विधि 1: जॉइन के साथ (सभी संस्करण)
SELECT d1.*
FROM DemoTable621 d1
JOIN (
SELECT UserName, UserEmailId, MAX(UserLastPost) AS max_post
FROM DemoTable621
GROUP BY UserName, UserEmailId
) d2 ON d1.UserName = d2.UserName
AND d1.UserEmailId = d2.UserEmailId
AND d1.UserLastPost = d2.max_post;
विधि 2: ROW_NUMBER() विंडो फ़ंक्शन (MySQL 8.0+)
SELECT UserName, UserEmailId, UserLastPost
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY UserName, UserEmailId ORDER BY UserLastPost DESC) AS rn
FROM DemoTable621
) t
WHERE rn = 1;
विधि 3: उपक्वेरी में ORDER BY + LIMIT (पुराना MySQL)
SELECT * FROM DemoTable621 d1
WHERE UserLastPost = (
SELECT MAX(UserLastPost)
FROM DemoTable621 d2
WHERE d2.UserName = d1.UserName
AND d2.UserEmailId = d1.UserEmailId
);