mysql单表树形依赖结构,从根节点到叶子节点方向,获取符合条件的id集合
需求
获取全部绿色节点的id,且该树不一定为二叉树
表结构
先查询出表数据
然后通过java去过滤
private String getLoopIdsStr(Integer powerInfoId) {
List<Integer> existIds = new ArrayList<>();
List<Integer> nullIds = new ArrayList<>();
List<LoopConfigId> configIds = energyLossMapper.getLoopConfigIds(powerInfoId);
if (CollUtil.isEmpty(configIds)) {
return null;
}
Integer level = configIds.stream().max(Comparator.comparing(LoopConfigId::getLevel)).get().getLevel();
for (int i = 1; i <= level; i++) {
if (i == 1) {
Map<Integer, Integer> select = filterLoopId(null, configIds);
if (CollUtil.isEmpty(select)) {
return CollUtil.join(existIds, ",");
}
select.forEach((key, value) -> {
if (null == value) {
nullIds.add(key);
} else {
existIds.add(key);
}
});
} else {
if (CollUtil.isEmpty(nullIds)) {
return CollUtil.join(existIds, ",");
}
Map<Integer, Integer> select = filterLoopId(nullIds, configIds);
if (CollUtil.isEmpty(select)) {
return CollUtil.join(existIds, ",");
}
nullIds.clear();
select.forEach((key, value) -> {
if (null == value) {
nullIds.add(key);
} else {
existIds.add(key);
}
});
}
}
return CollUtil.join(existIds, ",");
}
public Map<Integer, Integer> filterLoopId(List<Integer> parentIds, List<LoopConfigId> loopList) {
Map<Integer, Integer> map = new HashMap<>();
if (CollUtil.isEmpty(parentIds)) {
for (LoopConfigId dto : loopList) {
if (1 == dto.getLevel()) {
map.put(dto.getId(), dto.getDeviceId());
}
}
return map;
}
for (LoopConfigId dto : loopList) {
if (parentIds.contains(dto.getParentId())) {
map.put(dto.getId(), dto.getDeviceId());
}
}
return map;
}