Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में कॉलम नाम द्वारा GROUP BY करके अंतिम अपडेट कैसे प्राप्त करें?

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
);

सामान्य पैटर्न: प्रत्येक उपयोगकर्ता का नवीनतम ऑर्डर, प्रत्येक उत्पाद की नवीनतम कीमत, आदि।

  1. - MySQL में कॉलम अपडेट करें और ट्रेलिंग अंडरस्कोर मान हटाएं

    MySQL में किसी कॉलम से ट्रेलिंग अंडरस्कोर (_) मानों को हटाने के लिए TRIM() फंक्शन का उपयोग UPDATE स्टेटमेंट के साथ किया जाता है। सिंटैक्स: UPDATE yourTableName SET yourColumnName = TRIM(TRAILING _ FROM yourColumnName); आइए एक उदाहरण से समझते हैं। पहले एक टेबल बनाते हैं: mysql> create table De

  1. - MySQL से कॉलम नाम और प्रकार कैसे निकालें?

    कॉलम नाम और प्रकार निकालने के लिए INFORMATION_SCHEMA.COLUMNS का उपयोग करें: select concat(column_name,=,data_type) as anyAliasName from information_schema.columns where table_schema= yourDatabaseName and table_name= yourTableName; आइए पहले एक टेबल बनाते हैं: mysql> create table DemoTable1812 (

  1. - Java के साथ MySQL में वर्तमान तारीख में महीने जोड़ें

    सिंटैक्स String query = INSERT INTO yourTableName VALUES (CURDATE() + INTERVAL howManyMonths MONTH); उदाहरण वर्तमान तारीख: 2020-10-25 2 महीने जोड़ने के बाद: 2020-12-25 Java कोड 0) System.out.println(Record inserted successfully..Look into the database); else System.out.print