需求:按照ancestors的顺序拼接name并返回
效果图:
如果使用正常的查询方式,结果会有一定出入:
ancestors字段是按数字从小到大或者从大到小拼接时,数据是正确的,且符合预计结果;
若果出现不是按照从小到大或者从大到小拼接就会出现问题
如ancestors为:0,1,5,3时 ancestorsName的结果就是 : 高三/数学/二班
所以在这里使用group_concat和substring_index函数,并引用(@i:=@i+1)自增生成伪列ROWNUM
SELECT
aa.id,
aa.name,
aa.ancestors,
group_concat( aa.anname ORDER BY aa.rownum SEPARATOR '/' ) AS ancestors_name
FROM
(
SELECT
( @i := @i + 1 ) AS rownum,
a.*
FROM
(
SELECT
si.id,
si.name,
si.ancestors,
an.id anid,
an.name anname
FROM
xxx表 si
LEFT JOIN xxx表 an ON FIND_IN_SET( an.id, si.ancestors )
WHERE
si.del_flag = '0'
ORDER BY
substring_index( si.ancestors,anid,1)
) a,
( SELECT @i := 0 ) AS init
) aa
GROUP BY
aa.id
先通过
ORDER BY
substring_index( si.ancestors,anid,1) 按自定义顺序排序并通过(@i:=@i+1)自增生成伪列ROWNUM生成伪ID
之后使用group_concat拼接