Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ดึงแถวเฉพาะเมื่อค่าซ้ำกันใน MySQL ด้วย GROUP BY

บทความนี้สาธิตวิธีดึงแถวเฉพาะ (Distinct Row) เมื่อมีค่าซ้ำในคอลัมน์ Name โดยใช้ Subquery เรียงลำดับก่อน แล้วค่อย GROUP BY เพื่อเลือกแถวล่าสุด (Id มากที่สุด) ของแต่ละชื่อ

สร้างตารางและข้อมูลทดสอบ

mysql> CREATE TABLE DemoTable659 (Id INT, Name VARCHAR(100), Score INT);
Query OK, 0 rows affected (0.52 sec)

mysql> INSERT INTO DemoTable659 VALUES(11, 'John', 45);
mysql> INSERT INTO DemoTable659 VALUES(15, 'John', 59);
mysql> INSERT INTO DemoTable659 VALUES(15, 'Sam', 61);

ข้อมูลในตาราง

+------+------+-------+
| Id   | Name | Score |
+------+------+-------+
| 11   | John | 45    |
| 15   | John | 59    |
| 15   | Sam  | 61    |
+------+------+-------+

คิวรีดึงแถวล่าสุดของแต่ละชื่อ (Id มากที่สุด)

mysql> SELECT * FROM (
    SELECT * FROM DemoTable659 ORDER BY Id DESC
) tbl GROUP BY Name;

ผลลัพธ์

+------+------+-------+
| Id   | Name | Score |
+------+------+-------+
| 11   | John | 45    |
| 15   | Sam  | 61    |
+------+------+-------+

คำอธิบาย:

  • Subquery เรียง Id จากมากไปน้อย (DESC) ก่อน
  • GROUP BY Name จะเลือกแถวแรกของแต่ละกลุ่ม (ซึ่งคือ Id มากที่สุด)
  • คำเตือน: พฤติกรรมนี้ขึ้นกับ SQL Mode (ONLY_FULL_GROUP_BY) ใน MySQL 5.7+ อาจต้องใช้ ANY_VALUE() หรือ Aggregate Function

วิธีมาตรฐาน (แนะนำ):

SELECT t1.* FROM DemoTable659 t1
JOIN (
    SELECT Name, MAX(Id) AS MaxId FROM DemoTable659 GROUP BY Name
) t2 ON t1.Name = t2.Name AND t1.Id = t2.MaxId;