需構建一個用戶管理視圖 v_usermanage,聚合顯示:
provide = '0' 的區段記錄。CREATE VIEW `v_noprovide` AS
SELECT * FROM tb_section WHERE provide = '0';
CREATE VIEW `v_thismonth` AS
SELECT ts.userId AS id,
CONCAT('thismonth:', SUM(ts.amount), 'yuan') AS thismonth
FROM tb_section AS ts
WHERE ts.yearMonth = DATE_FORMAT(NOW(), '%Y%m');
CREATE VIEW `v_lastmonth` AS
SELECT ts.userId AS id,
CONCAT('lastmonth:', SUM(ts.amount), 'yuan') AS lastmonth
FROM tb_section AS ts
WHERE ts.yearMonth = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y%m');
CREATE VIEW `v_usermanage` AS
SELECT u.id AS id,
u.email AS email,
u.`name` AS `name`,
CONCAT(
COALESCE(la.lastmonth, 'lastmonth:0yuan'),
COALESCE(th.thismonth, 'thismonth:0yuan')
) AS recent,
SUM(COALESCE(b.amount, 0)) AS totalBonus,
SUM(COALESCE(n.amount, 0)) AS unbilled
FROM tb_user AS u
LEFT JOIN tb_bonus AS b ON u.id = b.receiverId
LEFT JOIN v_noprovide AS n ON u.id = n.userId
LEFT JOIN v_thismonth AS th ON u.id = th.id
LEFT JOIN v_lastmonth AS la ON u.id = la.id
GROUP BY u.id;
| 技術點 | 作用 |
|---|---|
DATE_FORMAT(NOW(), '%Y%m') | 動態獲取當前年月,無需硬編碼 |
DATE_SUB(NOW(), INTERVAL 1 MONTH) | 精確計算上月,跨年自動處理 |
COALESCE(col, default) | 將 NULL 替換為友好提示,避免前端判空 |
CONCAT(...) | 拼接多字段為單一展示列 |
多層 LEFT JOIN | 保留所有用戶,無匹配行自動填 NULL |
| 視圖嵌套 | 將複雜邏輯拆解為可復用、可維護的單元 |
tb_section.userId、yearMonth、provide 有組合索引;tb_bonus.receiverId 有索引。CREATE TABLE ... AS SELECT 方案。derived_merge 優化器開關。