我是MySQL和数据库的新手,我在许多地方都看到,在MySQL的SELECT字段中使用子查询并不是一个好的编程习惯,如下所示:
select userid, avg(num_pages)
from (select userid , pageid , regid , count(regid) as num_pages
from reg_pag
where ativa = 1
group by userid, pageid) as from_query
group by userid;
计算用户每页的平均寄存器数。
问题:
如何更改查询以使其不使用FROM字段中的子查询?
是否有一种通常的方式来“扁平化”这样的查询?
答案 0 :(得分:3)
一种方法是使用count(distinct)
:
select userid, count(*) / count(distinct pageid)
from reg_pag
where ativa = 1
group by userid;
答案 1 :(得分:3)
每个用户每页的平均寄存器数也可以计算为每个用户的寄存器数除以每个用户的页数。使用count distinct来计算每个用户不同的psgeids:
select userid, count(regid) / count(distinct pageid) as avg_regs
from reg_pag
where ativa=1
group by userid;
没有通用的方法来展平此类查询。它甚至可能不会使其中的一些变平,否则首先要有这个功能是没有意义的。不要害怕在from子句中使用子查询,在某些情况下,它们可能比扁平查询更有效。但这是供应商甚至特定版本。