บทความนี้จะสาธิตวิธีการคำนวณอันดับ (Rank) ของข้อมูลในหลายคอลัมน์พร้อมกันใน MySQL โดยใช้ฟังก์ชัน FIND_IN_SET() ร่วมกับ GROUP_CONCAT() เพื่อจัดอันดับข้อมูลตามเกณฑ์ที่แตกต่างกัน
ตัวอย่างการสร้างตารางและข้อมูลทดสอบ
mysql> CREATE TABLE DemoTable634 (
FirstName VARCHAR(100),
Marks INT,
Age INT
);
Query OK, 0 rows affected (0.69 sec)
mysql> INSERT INTO DemoTable634 VALUES('John', 60, 23);
mysql> INSERT INTO DemoTable634 VALUES('Chris', 80, 21);
mysql> INSERT INTO DemoTable634 VALUES('Robert', 70, 24);
ข้อมูลในตาราง
+-----------+-------+------+
| FirstName | Marks | Age |
+-----------+-------+------+
| John | 60 | 23 |
| Chris | 80 | 21 |
| Robert | 70 | 24 |
+-----------+-------+------+
คิวรีสำหรับแสดงอันดับของคะแนนและอายุ
mysql> SELECT
FirstName,
Marks,
Age,
FIND_IN_SET(Marks, (
SELECT GROUP_CONCAT(Marks ORDER BY Marks DESC)
FROM DemoTable634
)) AS RankOfMarks,
FIND_IN_SET(Age, (
SELECT GROUP_CONCAT(Age ORDER BY Age DESC)
FROM DemoTable634
)) AS RankOfAge
FROM DemoTable634;
ผลลัพธ์
+-----------+-------+------+-------------+-----------+
| FirstName | Marks | Age | RankOfMarks | RankOfAge |
+-----------+-------+------+-------------+-----------+
| John | 60 | 23 | 3 | 2 |
| Chris | 80 | 21 | 1 | 3 |
| Robert | 70 | 24 | 2 | 1 |
+-----------+-------+------+-------------+-----------+
คำอธิบาย: คิวรีนี้จะจัดอันดับคะแนน (Marks) จากมากไปน้อย และอายุ (Age) จากมากไปน้อยแยกกัน โดย Chris ได้อันดับ 1 ด้านคะแนน แต่อันดับ 3 ด้านอายุ ในขณะที่ Robert อายุมากที่สุดจึงได้อันดับ 1 ด้านอายุ