การเลือกหลายแถวที่มีค่าต่ำสุด (MIN) เท่ากันด้วย Subquery
ใช้ Subquery หา MIN(BookPrice) ก่อน แล้วกรองแถวที่มีราคาเท่ากับค่านั้น — ได้ทุกเล่มที่ร่วมกันเป็นราคาต่ำสุด
สร้างตารางและข้อมูล
mysql> create table DemoTable1414 (
-> BookTitle varchar(40),
-> BookPrice int
-> );
Query OK, 0 rows affected (0.82 sec)
mysql> insert into DemoTable1414 values('Deep dive using java', 560);
mysql> insert into DemoTable1414 values('C++ in depth', 360);
mysql> insert into DemoTable1414 values('Data structure in C', 590);
mysql> insert into DemoTable1414 values('Algorithm in C++', 1090);
mysql> insert into DemoTable1414 values('Java in Depth', 360);
ข้อมูลทั้งหมด
+----------------------+-----------+ | BookTitle | BookPrice | +----------------------+-----------+ | Deep dive using java | 560 | | C++ in depth | 360 | | Data structure in C | 590 | | Algorithm in C++ | 1090 | | Java in Depth | 360 | +----------------------+-----------+
คำสั่ง Subquery หา MIN
mysql> select BookTitle
-> from DemoTable1414
-> where BookPrice = (select min(BookPrice) from DemoTable1414);
ผลลัพธ์ (2 เล่ม ราคา 360)
+---------------+ | BookTitle | +---------------+ | C++ in depth | | Java in Depth | +---------------+
วิธีอื่น: JOIN กับ Subquery (เหมือน ID 1004074934)
SELECT t.BookTitle, t.BookPrice FROM DemoTable1414 t JOIN (SELECT MIN(BookPrice) AS min_price FROM DemoTable1414) m ON t.BookPrice = m.min_price;
MySQL 8.0+: Window Function
SELECT BookTitle, BookPrice
FROM (
SELECT BookTitle, BookPrice,
RANK() OVER (ORDER BY BookPrice ASC) as rnk
FROM DemoTable1414
) t
WHERE rnk = 1;
RANK() ให้อันดับ 1 แก่ทุกแถวที่มีค่าต่ำสุดเท่ากัน
ขยาย: หา Bottom-N Prices (ราคาต่ำสุด N อันดับ)
SELECT DISTINCT BookPrice FROM DemoTable1414 ORDER BY BookPrice ASC LIMIT 3;
ได้ 3 ราคาต่ำสุดที่ไม่ซ้ำ: 360, 560, 590
กรณีต้องการทุกแถวที่อยู่ใน Bottom-N Prices
SELECT BookTitle, BookPrice FROM DemoTable1414 WHERE BookPrice IN ( SELECT DISTINCT BookPrice FROM DemoTable1414 ORDER BY BookPrice ASC LIMIT 3 );
สรุป: Subquery WHERE col = (SELECT MIN(...)) เรียบง่าย ที่สุดสำหรับหา "ทุกแถวที่มีค่าต่ำสุด"