用戶表 users 與作品表 works 為一對多關係,需查詢用戶及其所有作品,前端展示為用戶卡片內嵌作品列表。
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());
SELECT * FROM users WHERE status=1 LIMIT 20 OFFSET 0SELECT * FROM works WHERE user_id IN (?,?,...)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 聚合) |