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

MySQL: หาค่าต่ำสุด (MIN) จากคอลัมน์ทศนิยม ที่มี ID ซ้ำกัน ด้วย GROUP BY

รูปแบบคำสั่ง

SELECT MIN(yourColumnName) FROM yourTableName GROUP BY yourColumnName;

หมายเหตุ: ตัวอย่างต้นฉบับมี GROUP BY yourColumnName ซ้ำ ควรเป็น GROUP BY id_column

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

mysql> create table DemoTable2005 ( Id int, Price float );
mysql> insert into DemoTable2005 values(1, 56.88);
mysql> insert into DemoTable2005 values(1, 120.56);

ข้อมูลในตาราง

+------+--------+
| Id   | Price  |
+------+--------+
| 1    | 56.88  |
| 1    | 120.56 |
+------+--------+

Query หาค่า Price ต่ำสุด จัดกลุ่มตาม Id

mysql> select min(Price) from DemoTable2005 group by Id;

ผลลัพธ์

+------------+
| min(Price) |
+------------+
| 56.88      |
+------------+

อธิบาย

  • GROUP BY Id จับกลุ่มแถวที่ Id เดียวกัน (Id=1 มี 2 แถว)
  • MIN(Price) หาค่าน้อยสุดในแต่ละกลุ่ม
  • ผลลัพธ์: 56.88 (น้อยกว่า 120.56)

ขยาย: ดึง Id และ Min Price พร้อมกัน

SELECT Id, MIN(Price) AS MinPrice FROM DemoTable2005 GROUP BY Id;
+------+----------+
| Id   | MinPrice |
+------+----------+
| 1    | 56.88    |
+------+----------+

กรณีต้องการดูข้อมูลแถวเต็มของค่าต่ำสุด

-- MySQL 8.0+ Window Function
SELECT Id, Price FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Price ASC) AS rn
    FROM DemoTable2005
) t WHERE rn = 1;

-- ทุก Version (Self Join)
SELECT t1.* FROM DemoTable2005 t1
JOIN (
    SELECT Id, MIN(Price) AS MinPrice FROM DemoTable2005 GROUP BY Id
) t2 ON t1.Id = t2.Id AND t1.Price = t2.MinPrice;

ข้อควรระวังกับ FLOAT

  • FLOAT และ DOUBLE เป็น Approximate Numeric (เก็บค่าประมาณ)
  • การเปรียบเทียบ =, MIN, MAX อาจให้ผลผิดปกติจาก Precision Error
  • แนะนำ: ใช้ DECIMAL(precision, scale) สำหรับเงิน/ราคา (เช่น DECIMAL(10,2))

ตัวอย่างแก้ไขเป็น DECIMAL

CREATE TABLE DemoTable2005_Fixed (
    Id INT,
    Price DECIMAL(10,2)  -- รองรับสูงสุด 99,999,999.99
);