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

MySQL: หาหนังสือราคาต่ำสุด (MIN) หลายเล่มที่มีราคาเท่ากัน

การเลือกหลายแถวที่มีค่าต่ำสุด (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(...)) เรียบง่าย ที่สุดสำหรับหา "ทุกแถวที่มีค่าต่ำสุด"