บทความนี้สาธิตวิธีดึงแถวเฉพาะ (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;