我有这个递归的SQL查询,我获得每个办公室的ID层次结构(一个办公室属于更高级别的办公室等) - 受@ leftclickben在How to do the Recursive SELECT query in MySQL?中的回答的启发:
select @pv := o.office_id, o.display_name, (
select concat(concat(group_concat(@pv := t.parent_office_id order by t.parent_office_id asc SEPARATOR '.' ), '.'), t.office_id) pivot
from (select * from office order by (CASE WHEN parent_office_id < office_id THEN parent_office_id END) DESC,
(CASE WHEN parent_office_id > office_id THEN parent_office_id END) ASC) t
where t.office_id = @pv
) 'hierarchy'
from office o
group by o.office_id
order by o.office_id asc, o.parent_office_id desc
;
要使此查询起作用,需要验证perferct descendance或ascendance。我的数据未验证此属性,因此我必须在子查询中利用选择性顺序。
我获得了非常令人鼓舞的结果(80%准确度),我想知道是否有人可以提出更多技巧来获得更好的结果?
示例:
- for some office (ID = 97), its hierarchy is 1.2.4.14.97 (accurate value);
- for another case (ID = 101), I get: 111.101 (broken hierarchy);
简而言之,所有结果必须以1开头。
一个好样本: