หาค่าในตารางที่ >= Target และมีค่าน้อยที่สุด (Ceiling Value)
ใช้ ORDER BY ABS(Value - Target), Value แล้ว LIMIT 1 เพื่อหาค่าที่ใกล้ Target มากที่สุด (ถ้าเท่ากัน ให้ค่าที่มากกว่า)
สร้างตารางและข้อมูล
mysql> CREATE TABLE DemoTable (Value INT); Query OK, 0 rows affected (1.33 sec) mysql> INSERT INTO DemoTable VALUES(25), (75), (100); Query OK, 3 rows affected
คำสั่ง: หาค่า >= 50 ที่น้อยที่สุด (Nearest Greater or Equal)
mysql> SELECT * FROM DemoTable
-> ORDER BY ABS(Value - 50), Value DESC
-> LIMIT 1;
ผลลัพธ์
+-------+ | Value | +-------+ | 75 | +-------+
คำอธิบาย
| Value | ABS(Value-50) | Value DESC | ลำดับ |
|---|---|---|---|
| 25 | 25 | 25 | 2 |
| 75 | 25 | 75 | 1 (Win: ABS เท่ากัน แต่ Value มากกว่า) |
| 100 | 50 | 100 | 3 |
⚠️ ข้อจำกัด: ไม่ใช่ True Ceiling (อาจคืนค่าน้อยกว่า Target)
สูตร ABS(Value - Target) หา "ใกล้ที่สุด" ไม่ใช่ "มากกว่าหรือเท่าที่น้อยที่สุด"
ตัวอย่าง: Target=50, ค่ามี 49 และ 51 → ABS(49-50)=1, ABS(51-50)=1 → คืน 51 (เพราะ Value DESC)
แต่ถ้ามี 49 และ 52 → ABS(49-50)=1, ABS(52-50)=2 → คืน 49 (น้อยกว่า Target!)
True Ceiling (มากกว่าหรือเท่าที่น้อยที่สุด): ใช้ WHERE + ORDER BY + LIMIT
SELECT * FROM DemoTable WHERE Value >= 50 ORDER BY Value ASC LIMIT 1;
True Floor (น้อยกว่าหรือเท่าที่มากที่สุด)
SELECT * FROM DemoTable WHERE Value <= 50 ORDER BY Value DESC LIMIT 1;
กรณีต้องการทั้ง Ceiling และ Floor พร้อมกัน
(SELECT * FROM DemoTable WHERE Value >= 50 ORDER BY Value ASC LIMIT 1) UNION ALL (SELECT * FROM DemoTable WHERE Value <= 50 ORDER BY Value DESC LIMIT 1);