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

MySQL: หาวันที่ล่าสุด (Last Date) จากเรคคอร์ดด้วย MAX() และ Subquery


คำอธิบาย

ใช้ MAX() หาวันที่มากที่สุด (ล่าสุด) แล้วนำไปเปรียบเทียบใน WHERE clause ผ่าน Subquery

ขั้นตอนการสร้างตารางและข้อมูลตัวอย่าง

mysql> create table DemoTable ( 
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    ExpiryDate date ); 
Query OK, 0 rows affected (1.40 sec)

การเพิ่มข้อมูล

mysql> insert into DemoTable(ExpiryDate) values('2018-12-31'); 
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(ExpiryDate) values('2019-09-01'); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(ExpiryDate) values('2019-09-01'); 
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(ExpiryDate) values('2016-08-30'); 
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(ExpiryDate) values('2019-06-23'); 
Query OK, 1 row affected (0.17 sec)

แสดงข้อมูลทั้งหมด

mysql> select * from DemoTable;

ผลลัพธ์:

+----+------------+
| Id | ExpiryDate |
+----+------------+
| 1  | 2018-12-31 |
| 2  | 2019-09-01 |
| 3  | 2019-09-01 |
| 4  | 2016-08-30 |
| 5  | 2019-06-23 |
+----+------------+
5 rows in set (0.00 sec)

คิวรี่หาเรคคอร์ดที่มีวันที่ล่าสุด

mysql> select * from DemoTable 
where ExpiryDate = (select max(ExpiryDate) from DemoTable);

ผลลัพธ์

+----+------------+
| Id | ExpiryDate |
+----+------------+
| 2  | 2019-09-01 |
| 3  | 2019-09-01 |
+----+------------+
2 rows in set (0.00 sec)

คำอธิบาย

  • Subquery (select max(ExpiryDate) from DemoTable) คืนค่า '2019-09-01'
  • WHERE clause กรองเฉพาะแถวที่ ExpiryDate เท่ากับค่านั้น
  • ได้ 2 เรคคอร์ด (Id 2 และ 3) เพราะมีวันที่เดียวกัน

วิธีอื่น: ใช้ ORDER BY LIMIT

SELECT * FROM DemoTable 
ORDER BY ExpiryDate DESC 
LIMIT 1;

แต่วิธีนี้ให้แค่ 1 เรคคอร์ด (ถ้ามีวันที่ซ้ำหลายเรคคอร์ด จะสุ่มได้ 1 เรคคอร์ด)

ประสิทธิภาพ

Subquery MAX() ทำงานเร็วกว่าสำหรับตารางขนาดใหญ่ที่มี Index บนคอลัมน์วันที่