在 MySQL 中,假設有一張商品表 table1,包含 id(主鍵)、name(商品名稱)和 price(價格)三個欄位。表中存在相同名稱但不同價格的記錄,需求是按名稱分組,每組只保留價格最低的那一筆記錄。
CREATE TABLE table1 (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
price FLOAT DEFAULT 0
);
INSERT INTO table1 (name, price) VALUES
('玉米', 10), ('大米', 20), ('小麥', 30), ('西瓜', 40),
('玉米', 15), ('大米', 16), ('小麥', 35), ('西瓜', 36);
使用 GROUP BY 搭配聚合函數 MIN() 即可輕鬆實現:
SELECT name, MIN(price) AS min_price
FROM table1
GROUP BY name
ORDER BY min_price;
| name | min_price |
|---|---|
| 玉米 | 10 |
| 大米 | 16 |
| 小麥 | 30 |
| 西瓜 | 36 |
若需要顯示對應的 id 或其他欄位,可使用子查詢或視窗函數(MySQL 8.0+):
-- 方法一:子查詢(適用於所有版本)
SELECT t1.*
FROM table1 t1
JOIN (
SELECT name, MIN(price) AS min_price
FROM table1
GROUP BY name
) t2 ON t1.name = t2.name AND t1.price = t2.min_price;
-- 方法二:ROW_NUMBER() 視窗函數(MySQL 8.0+)
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY price) AS rn
FROM table1
)
SELECT id, name, price
FROM ranked
WHERE rn = 1;
GROUP BY + MIN() 最簡潔。ORDER BY 加上 id 作為第二排序鍵。