การค้นหาแถวที่มีค่าสูงสุดในคอลัมน์เฉพาะ (Top 1 by Value)
ใช้ Subquery หา MAX(upvote_column) แล้วกรองแถวที่ตรงค่านั้น
Syntax
SELECT column_to_return FROM table_name WHERE value_column = (SELECT MAX(value_column) FROM table_name);
ตัวอย่าง: หารูปภาพที่ได้ Upvote มากที่สุด
สร้างตารางเก็บรูปและ Upvote:
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ImagePath VARCHAR(100),
UpvoteValue INT
);
Query OK, 0 rows affected (0.72 sec)
mysql> INSERT INTO DemoTable (ImagePath, UpvoteValue) VALUES
('Image1.jpeg', 90), ('Image2.jpeg', 10), ('Image3.jpeg', 120), ('Image4.jpeg', 114);
Query OK, 4 rows affected
ข้อมูลทั้งหมด:
mysql> SELECT * FROM DemoTable;
+----+-------------+-------------+ | Id | ImagePath | UpvoteValue | +----+-------------+-------------+ | 1 | Image1.jpeg | 90 | | 2 | Image2.jpeg | 10 | | 3 | Image3.jpeg | 120 | | 4 | Image4.jpeg | 114 | +----+-------------+-------------+ 4 rows in set (0.00 sec)
ดึง ImagePath ที่มี Upvote สูงสุด:
mysql> SELECT ImagePath FROM DemoTable WHERE UpvoteValue = (SELECT MAX(UpvoteValue) FROM DemoTable);
+-------------+ | ImagePath | +-------------+ | Image3.jpeg | +-------------+ 1 row in set (0.00 sec)
กรณีมีหลายแถวค่าเท่ากันสูงสุด (Tie)
คิวรี่ข้างบนจะคืน **ทุกแถว** ที่มีค่าเท่ากับ MAX
-- เพิ่มข้อมูลทดสอบ
INSERT INTO DemoTable (ImagePath, UpvoteValue) VALUES ('Image5.jpeg', 120);
-- Query เดิมจะคืน 2 แถว
SELECT ImagePath FROM DemoTable WHERE UpvoteValue = (SELECT MAX(UpvoteValue) FROM DemoTable);
-- Result: Image3.jpeg, Image5.jpeg
วิธีอื่น: ใช้ ORDER BY ... LIMIT 1 (เอาแค่ 1 แถว)
SELECT ImagePath FROM DemoTable ORDER BY UpvoteValue DESC LIMIT 1;
- เร็วกว่า (ใช้ Index ได้)
- แต่ได้แค่ 1 แถว แม้จะมี Tie
วิธีอื่น: ใช้ IN (เหมือนตัวอย่างต้นฉบับ)
SELECT ImagePath FROM DemoTable WHERE UpvoteValue IN (SELECT MAX(UpvoteValue) FROM DemoTable);
เทียบเท่ากับ = แต่เขียนได้หลายค่า (แม้ MAX จะคืนค่าเดียว)
ประสิทธิภาพ
- ต้องมี Index บน
UpvoteValueเพื่อความเร็ว - Subquery
MAX()ทำงานได้เร็ว (Index Scan) - สำหรับ Top-N ใช้
ORDER BY ... LIMIT n