Phoenix框架中统计学校学生数,含无学生学校返回0的实现
解决Phoenix中统计所有学校学生数(含无学生学校返回0)的问题
原代码存在两个关键问题,导致无法返回无学生的学校:
where条件会过滤掉左连接后u为NULL的记录(也就是没有学生的学校)count(s.id)统计的是学校自身的数量,每个学校至少返回1,无法得到0的结果
修改后的代码如下:
def list_schools do School |> join(:left, [s], u in assoc(s, :users), on: u.role == ^:student) |> group_by([s], s.id) |> select([s, u], {s, count(u.id)}) |> Repo.all() end
关键改动说明:
- 将角色过滤条件从
where移至left join的on参数中:左连接只会关联学生角色的用户,无学生的学校仍会被保留,只是关联的用户记录为NULL - 使用
count(u.id)替代count(s.id):count函数会忽略NULL值,无匹配学生时u.id为NULL,统计结果为0;有学生时则正常统计学生数量
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

