首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 一對多關聯查詢:JOIN 獲取扁平數據 + 應用層聚合 / 子查詢分頁優化

     編輯:程式設計綜合問答

場景建模

用戶表 users 與作品表 works 為一對多關係,需查詢用戶及其所有作品,前端展示為用戶卡片內嵌作品列表。

方案一:JOIN 扁平查詢 + 代碼聚合(推薦中小數據量)

SELECT u.id, u.name, w.id AS work_id, w.title, w.cover
FROM users u
LEFT JOIN works w ON u.id = w.user_id
WHERE u.status = 1
ORDER BY u.id, w.created_at DESC;

應用層處理:遍歷結果集,按 user_id 分組構建巢狀結構:

Map map = new LinkedHashMap<>();
for (Row row : resultSet) {
    UserVO user = map.computeIfAbsent(row.getUserId(), id -> new UserVO(id, row.getUserName()));
    if (row.getWorkId() != null)
        user.getWorks().add(new WorkVO(row.getWorkId(), row.getTitle(), row.getCover()));
}
List users = new ArrayList<>(map.values());

方案二:分步查詢(適合大數據量/分頁)

  1. 查用戶列表(分頁):SELECT * FROM users WHERE status=1 LIMIT 20 OFFSET 0
  2. 批量查作品:SELECT * FROM works WHERE user_id IN (?,?,...)
  3. 3. 內存映射組裝(同方案一)

方案三:子查詢 JSON 聚合(MySQL 5.7+/PostgreSQL)

SELECT u.*, 
  (SELECT JSON_ARRAYAGG(JSON_OBJECT('id', w.id, 'title', w.title))
   FROM works w WHERE w.user_id = u.id) AS works
FROM users u WHERE u.status = 1;

選型建議

場景推薦方案
數據量小、無分頁、需所有關聯數據方案一(單 SQL + 內存聚合)
大數據量、分頁、高併發方案二(分步查詢 + 批量 IN)
數據庫支持 JSON、前端直渲染方案三(JSON 聚合)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved