แนวคิด
คำนวณสมการจาก 2 คอลัมน์ใน SELECT แล้ว ORDER BY ผลลัพธ์นั้นได้ โดยใช้ alias หรือคำนวณซ้ำใน ORDER BY
รูปแบบคำสั่ง
SELECT (expression) AS calc_name FROM yourTable ORDER BY calc_name DESC;
ตัวอย่างครบถ้วน
1. สร้างตาราง
mysql> create table orderByAFunctionDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstNumber int,
-> SecondNumber int
-> );
Query OK, 0 rows affected (0.44 sec)
2. เพิ่มข้อมูล
mysql> insert into orderByAFunctionDemo(FirstNumber,SecondNumber) values(10,4); Query OK, 1 row affected (0.11 sec) mysql> insert into orderByAFunctionDemo(FirstNumber,SecondNumber) values(45,78); Query OK, 1 row affected (0.17 sec) mysql> insert into orderByAFunctionDemo(FirstNumber,SecondNumber) values(23,10); Query OK, 1 row affected (0.12 sec) mysql> insert into orderByAFunctionDemo(FirstNumber,SecondNumber) values(67,237); Query OK, 1 row affected (0.16 sec) mysql> insert into orderByAFunctionDemo(FirstNumber,SecondNumber) values(12,90); Query OK, 1 row affected (0.13 sec)
3. ดูข้อมูลดิบ
mysql> select * from orderByAFunctionDemo;
+----+-------------+--------------+ | Id | FirstNumber | SecondNumber | +----+-------------+--------------+ | 1 | 10 | 4 | | 2 | 45 | 78 | | 3 | 23 | 10 | | 4 | 67 | 237 | | 5 | 12 | 90 | +----+-------------+--------------+
4. คำนวณ (4*FirstNumber + 5*SecondNumber) และเรียง DESC
mysql> select (4*FirstNumber + 5*SecondNumber) as Calculation
-> from orderByAFunctionDemo
-> order by Calculation desc;
+-------------+ | Calculation | +-------------+ | 1453 | | 570 | | 498 | | 142 | | 60 | +-------------+
การคำนวณย้อนกลับ (Verification)
| Id | FirstNumber | SecondNumber | 4×F + 5×S |
|---|---|---|---|
| 4 | 67 | 237 | 268 + 1185 = 1453 ✓ |
| 2 | 45 | 78 | 180 + 390 = 570 ✓ |
| 3 | 23 | 10 | 92 + 50 = 142 ✓ |
| 5 | 12 | 90 | 48 + 450 = 498 ✓ |
| 1 | 10 | 4 | 40 + 20 = 60 ✓ |
เคล็ดลับ: ใช้ Alias ใน ORDER BY
MySQL อนุญาตให้ใช้ column alias ใน ORDER BY (ต่างจาก WHERE/GROUP BY ที่ใช้ไม่ได้)
กรณีซับซ้อน: ใช้ Subquery หรือ CTE
WITH calculated AS ( SELECT *, (4*FirstNumber + 5*SecondNumber) AS score FROM orderByAFunctionDemo ) SELECT Id, FirstNumber, SecondNumber, score FROM calculated ORDER BY score DESC;
ประโยชน์: ใช้ได้กับสูตรคำนวณทุกชนิด: คณิตศาสตร์ สถิติ การจัดอันดับ คะแนนรวม ฯลฯ