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

เลือกค่าเท่ากับหรือมากกว่าที่ใกล้ที่สุดจากตาราง MySQL (Nearest Greater or Equal)

หาค่าในตารางที่ >= 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 |
+-------+

คำอธิบาย

ValueABS(Value-50)Value DESCลำดับ
2525252
7525751 (Win: ABS เท่ากัน แต่ Value มากกว่า)
100501003

⚠️ ข้อจำกัด: ไม่ใช่ 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);