ใช้ GROUP BY ร่วม ORDER BY MAX(id) เพื่อ DISTINCT แล้วเรียงตาม ID สูงสุดของแต่ละกลุ่ม
ตัวอย่างการใช้งาน
1. สร้างตารางข้อมูลซ้ำ
mysql> CREATE TABLE DemoTable (Id INT, Name VARCHAR(100)); mysql> INSERT INTO DemoTable VALUES (10,'John'), (10,'John'), (20,'Sam'), (20,'Sam'), (30,'David'), (30,'David');
2. DISTINCT เรียง ID มากไปน้อย (Top 2)
mysql> SELECT Name FROM DemoTable
-> GROUP BY Name
-> ORDER BY MAX(Id) DESC
-> LIMIT 2;
ผลลัพธ์
+-------+ | Name | +-------+ | David | | Sam | +-------+
คำอธิบาย
GROUP BY Name→ รวมชื่อซ้ำ (ได้ 3 กลุ่ม: John, Sam, David)MAX(Id)→ หา ID สูงสุดในแต่ละกลุ่ม (John=10, Sam=20, David=30)ORDER BY MAX(Id) DESC→ เรียง David(30), Sam(20), John(10)LIMIT 2→ เอา 2 อันแรก
วิธีอื่น: ROW_NUMBER() (MySQL 8.0+)
WITH ranked AS (
SELECT Name, Id,
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Id DESC) AS rn
FROM DemoTable
)
SELECT Name FROM ranked WHERE rn = 1 ORDER BY Id DESC LIMIT 2;
ข้อควรระวัง
SELECT DISTINCT Name ... ORDER BY Id→ Error (Id ไม่อยู่ใน SELECT / GROUP BY)- MySQL ONLY_FULL_GROUP_BY mode ต้องระบุทุกคอลัมน์ใน SELECT ให้อยู่ใน GROUP BY หรือ Aggregate Function