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

MySQL: หาคะแนนสูงสุด 2 อันดับแรกด้วย MAX และ GROUP BY

การหาคะแนนสูงสุด (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 ทั้งตาราง" — ต้องอ่านโจทย์ให้ชัด