首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 聯合查詢中 GROUP_CONCAT、MAX、YEAR 函數實戰應用

     編輯:MySQL 綜合教學

業務場景

簡歷搜索系統:一個人可能有多條教育經歷,需在列表頁顯示最高學歷、所有專業匯總、年齡計算。

核心 SQL 示例

SELECT 
    pi.personid,
    pi.personname,
    pi.sex,
    YEAR(pi.birthday) AS birth_year,
    MAX(pe.education) AS highest_education,
    pe.school,
    GROUP_CONCAT(pe.`subject`) AS subjects
FROM person_info pi
LEFT JOIN person_edu pe ON pi.personid = pe.personid
WHERE pi.personid = ?
GROUP BY pi.personid;

函數詳細解析

GROUP_CONCAT() — 字符串聚合

  • 將分組內指定列值用分隔符連接,默認逗號
  • 常用參數:
    GROUP_CONCAT(DISTINCT pe.`subject` ORDER BY pe.`subject` SEPARATOR ';')
    
  • 注意:結果長度受 group_concat_max_len 限制(默認 1024 字節),大數據量需調大
  • 僅支持字符類型,數值類型需 CAST 轉換

MAX() — 聚合最大值

  • 配合學歷字典表(數值編碼越大學歷越高)取最高學歷
  • 同理 MIN() 可取最低值
  • 需與 GROUP BY 搭配使用

YEAR() / MONTH() — 日期提取

  • 從 DATE/DATETIME 提取年份/月份
  • 年齡計算更精確寫法:
    TIMESTAMPDIFF(YEAR, pi.birthday, CURDATE()) AS age
    

GROUP BY 關鍵機制

  • 將相同 personid 的多行合併為一行
  • 非聚合列(如 school)取值不確定(ONLY_FULL_GROUP_BY 模式下報錯)
  • 建議:所有非聚合列要么放入 GROUP BY,要么用聚合函數

性能優化建議

  1. 在 person_edu.personid 建立索引
  2. 大數據量時考慮子查詢預聚合再 JOIN
  3. 避免 SELECT *,只查所需列
  4. 適當增加 group_concat_max_len:SET SESSION group_concat_max_len = 100000;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved