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

ดึงค่าที่มี Upvote มากที่สุดใน MySQL ด้วย Subquery MAX()

การค้นหาแถวที่มีค่าสูงสุดในคอลัมน์เฉพาะ (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