การหาคะแนนสูงสุด (Top Scores) ต่อกลุ่มด้วย MAX และ GROUP BY
ตัวอย่างนี้หาคะแนนสูงสุดของแต่ละ Player (group by Id) แล้วเรียงจากสูงสุดไปต่ำสุด — ได้ Top 2 player scores
สร้างตารางและข้อมูล
mysql> create table DemoTable1383 (
-> Id int,
-> PlayerScore int
-> );
Query OK, 0 rows affected (0.90 sec)
mysql> insert into DemoTable1383 values(200, 78);
mysql> insert into DemoTable1383 values(200, 89);
mysql> insert into DemoTable1383 values(200, 89);
mysql> insert into DemoTable1383 values(200, 87);
mysql> insert into DemoTable1383 values(203, 97);
mysql> insert into DemoTable1383 values(200, 57);
ข้อมูลทั้งหมด
+------+-------------+ | Id | PlayerScore | +------+-------------+ | 200 | 78 | | 200 | 89 | | 200 | 89 | | 200 | 87 | | 203 | 97 | | 200 | 57 | +------+-------------+
คำสั่ง GROUP BY + MAX + ORDER BY + LIMIT
mysql> select Id, max(PlayerScore)
-> from DemoTable1383
-> group by Id
-> order by max(PlayerScore) DESC;
ผลลัพธ์ (Top 2 players)
+------+------------------+ | Id | max(PlayerScore) | +------+------------------+ | 203 | 97 | | 200 | 89 | +------+------------------+
ขยาย: หา Top N scores ทั้งตาราง (ไม่ group by player)
SELECT DISTINCT PlayerScore FROM DemoTable1383 ORDER BY PlayerScore DESC LIMIT 2;
ผลลัพธ์: 97, 89 (คะแนนสูงสุด 2 ค่าที่ไม่ซ้ำ)
ขยาย: หา Top 2 แถวที่มีคะแนนสูงสุด (รวม duplicate)
SELECT Id, PlayerScore FROM DemoTable1383 ORDER BY PlayerScore DESC LIMIT 2;
ผลลัพธ์: (203, 97), (200, 89) — แถวแรกและสองของการเรียง
Window Function (MySQL 8.0+) สำหรับ Top-N per Group
SELECT Id, PlayerScore
FROM (
SELECT Id, PlayerScore,
ROW_NUMBER() OVER (PARTITION BY Id ORDER BY PlayerScore DESC) as rn
FROM DemoTable1383
) t
WHERE rn <= 2;
ได้ Top 2 scores ต่อ player
สรุป: ตัวอย่างในบทความหา "คะแนนสูงสุดต่อ player แล้วเรียงหา top 2 players" ไม่ใช่ "top 2 scores ทั้งตาราง" — ต้องอ่านโจทย์ให้ชัด