首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL GROUP BY 取每群組任意一筆:供應商與單一產品關聯查詢技巧

     編輯:MySQL 資料庫相關知識

需求:供應商表 t_supplier、商品表 t_goods (一對多)。查詢所有供應商,各取任意一個商品關聯。

測試資料

CREATE TABLE t_supplier (id INT PRIMARY KEY, name VARCHAR(50));
CREATE TABLE t_goods (Id INT AUTO_INCREMENT PRIMARY KEY, Supplier_Id INT, Name VARCHAR(50), FOREIGN KEY (Supplier_Id) REFERENCES t_supplier(id));
INSERT INTO t_supplier VALUES (1,'天津供應商'), (2,'北京供應商');
INSERT INTO t_goods VALUES (1,1,'天津產品1'), (2,1,'天津產品2'), (3,2,'北京產品1'), (4,2,'北京產品2');

MySQL 獨有寫法

SELECT * FROM t_supplier s
LEFT JOIN t_goods g ON g.Supplier_Id = s.id
GROUP BY s.id;

結果

所有供應商各出現一次,t_goods 欄位取該群組第一筆(MySQL 允許非聚合/非 GROUP BY 欄位出現在 SELECT,自動取任一值)。

跨資料庫差異警示

其他資料庫 (PostgreSQL, Oracle, SQL Server, SQLite 新版) 嚴格禁止 此寫法,會報錯。需改用子查詢、窗口函數 ROW_NUMBER() 或聚合函數明確指定取值邏輯。

可攜帶寫法範例

-- 子查詢取第一筆
SELECT s.*, 
  (SELECT g.Name FROM t_goods g WHERE g.Supplier_Id = s.id LIMIT 1) AS goods_name
FROM t_supplier s;

-- 窗口函數 (MySQL 8.0+)
SELECT * FROM (
  SELECT s.*, g.Name, ROW_NUMBER() OVER (PARTITION BY s.id ORDER BY g.Id) AS rn
  FROM t_supplier s LEFT JOIN t_goods g ON g.Supplier_Id = s.id
) t WHERE rn = 1;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved