MySql 按姓氏的笔画顺序排序

需求:副部门中姓名按姓氏笔画排序,第一个姓相同的排第二个字,依此类推,并用‘,’隔开;部门(tjfh)用拼音排序

image

 解决方式:部门(tjfh)用CONVERT(tjfh USING GBK);副部门中姓名排序需要首先维护一个chinese_stroke_order 表,里面有每个中文字的笔画顺序。

笔画顺序排序.xlsx链接: https://pan.baidu.com/s/1Pgtc8n22Ah4U5sHr_PJJ8w?pwd=9uas 

SELECT
    tjfh,
    F_Id,
    MAX(zwwy) AS zwwy,
    GROUP_CONCAT(fzwwy ORDER BY oc1, oc2, oc3 ASC SEPARATOR '') AS A_xm_concat,
    MAX(msz) AS msz,
    MAX(slsj) AS slsj
FROM (
    SELECT
        a.A_mc AS tjfh,
        a.F_Id,
        DATE_FORMAT(a.A_slsj, '%Y-%m-%d') AS slsj,
        CASE WHEN zw.comInputField103='1' THEN xh.A_xm ELSE '' END AS zwwy,
        CASE WHEN zw.comInputField103='2' THEN xh.A_xm ELSE NULL END AS fzwwy,
        CASE WHEN zw.comInputField103='3' THEN xh.A_xm ELSE '' END AS msz,
        cso1.order_code AS oc1,
        cso2.order_code AS oc2,
        cso3.order_code AS oc3
    FROM fhjggl1 a
    LEFT JOIN xhzh_hzdjb_zbshttdrzwj1l AS z ON a.F_Id  =z.tjfh
    LEFT JOIN xhzh_hzd1jb xh ON xh.F_Id = z.MAIN_ID
    LEFT JOIN auto_tab1le_0245 zw ON zw.id =z.A_zw
    LEFT JOIN chinese_stroke_order AS cso1 ON cso1.name =left(xh.A_xm, 1)
    LEFT JOIN chinese_stroke_order AS cso2 ON cso2.name =SUBSTRING(xh.A_xm, 2, 1)
    LEFT JOIN chinese_stroke_order AS cso3 ON cso3.name =SUBSTRING(xh.A_xm, 3, 1) 
    WHERE length(a.A_jgbm)=5 and  
    (a.F_DeleteMark=0 or a.F_DeleteMark is null)  and (xh.F_DeleteMark=0 or xh.F_DeleteMark is null)
 
    and COALESCE(xh.A_xm,'')<>''
) a  
GROUP BY tjfh,F_Id 
ORDER BY  CONVERT(tjfh USING GBK)

 

posted @ 2026-01-21 11:53  NULL66  阅读(0)  评论(0)    收藏  举报