如何处理数据,实现按所选最低组织层级统计结果?
组织层级筛选统计问题
需求说明
前端设有4个下拉框,对应公司组织层级:Groups > Units > Departments > Teams
- 用户可单选某一分组,后续下拉框仅展示该分组下的下级选项;也可多选(比如同时选择Group1、Group2),展示对应所有下级选项
- 用户可自由选择任意层级的选项,最终需要按每组选择的最低层级统计结果数量
示例数据
| id | username | group | unit | department | team |
|---|---|---|---|---|---|
| 1 | user1 | g1 | u1 | d1 | t1 |
| 2 | user2 | g1 | u1 | d1 | t2 |
| 3 | user3 | g3 | u6 | d12 | t30 |
| 4 | user4 | g25 | u54 | d70 | t88 |
当前实现与疑问
目前通过Query Builder构建查询获取具体结果,比如用户选择g1>u1>d1和g25>u54>d70>t88时,代码如下:
foreach ($data as $row) { $myQuery->orWhere(function($query) use ($filter) { foreach ($filter as $column => $value) { $query->where($column, '=', $value); } }); }
生成的SQL:
SELECT * FROM table WHERE (group='g1' AND unit='u1' AND department='d1') OR (group='g25' AND unit='u54' AND department='d70' AND team='t88')
但需求是返回每组选择的统计数量而非具体结果,尝试用UNION ALL实现:
SELECT group , unit , department , NULL as team , COUNT(*) AS rows FROM table WHERE group='g1' AND unit='u1' AND department='d1' GROUP BY group , unit , department UNION ALL SELECT group , unit , department , team , COUNT(*) AS rows FROM table WHERE group='g25' AND unit='u54' AND department='d70' AND team='t88' GROUP BY group , unit , department , team
现有疑问:
- 能否通过Query Builder实现上述
UNION ALL的统计逻辑? - 当前的数据组织或查询构建方式是否合理?是否需要调整数据结构?
- 有没有更优的其他实现方案?
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

