Mysql 将子查询与id连接的子句分组时出现错误1054
获取此查询:Mysql 将子查询与id连接的子句分组时出现错误1054,mysql,sql,mysql-error-1054,mysql-5.5,Mysql,Sql,Mysql Error 1054,Mysql 5.5,获取此查询: select T.id_empresa, max(periodo) as ultimoPeriodo, ( select sum(monto) from cuotasindical.pagos where id_empresa = T.id_empresa and periodo = max(T.periodo) ) as ultimoM
select
T.id_empresa, max(periodo) as ultimoPeriodo, (
select sum(monto) from cuotasindical.pagos
where id_empresa = T.id_empresa and periodo = max(T.periodo)
) as ultimoMonto,
min(periodo) as periodoAnterior, (
select sum(monto) from cuotasindical.pagos
where id_empresa = T.id_empresa and periodo = min(T.periodo)
) as anteriorMonto
from
(
select
P1.id_empresa, P1.periodo, sum(monto) as monto
from cuotasindical.pagos P1
where P1.id_empresa in (select id_empresa from cuotasindical.empresa where id_delegacion = 5)
group by P1.id_empresa, P1.periodo
having P1.periodo in (
select * from (
select periodo
from cuotasindical.pagos
where P1.id_empresa = id_empresa order by periodo desc limit 2
) as L
)
and count(distinct P1.periodo) > 1
) T
group by id_empresa
having (abs(max(monto) - min(monto))*100/
(
select sum(monto) from cuotasindical.pagos T2
where T2.id_empresa = id_empresa and T2.periodo = max(periodo)
) > 10);
对于每个empresa,需要比较最后两个PAGO(由periodo订购),以查看其差异是否大于或小于某个百分比(在本例中为10)
我要走了
错误代码:1054。“where子句”中的未知列“P1.id\u empresa”
其中唯一具有该比较的where子句是具有limit的子查询
having P1.periodo in (
select * from (
select periodo
from cuotasindical.pagos
where P1.id_empresa = id_empresa
order by periodo desc limit 2
) as L
)
and count(distinct P1.periodo) > 1
双重子查询用于避免in子句中的限制2(在链接上获取该限制)
为什么我会犯这样的错误?我想我可以在having子句中的子查询中加入group by之后(就像where子句一样)
或者是我遗漏了一个错误
提前感谢问题在于mysql在子查询中只有一个深层次的作用域 我还有子查询限制的问题,所以,我所做的是
..having P1.periodo in
(
select max(periodo) as periodo
from cuotasindical.pagos H
where P1.id_empresa = id_empresa
) OR
P1.periodo in (
select max(periodo) as periodo
from cuotasindical.pagos H
where P1.id_empresa = id_empresa and periodo != P1.periodo
)
and count(distinct P1.periodo) > 1
在specefic错误中,id_empresa实际上是cuotasindical.pagos中的一列吗 如果不是这样,我认为优化器可能会感到困惑,因为having子句包含了组中某个内容的信息,by。。。“在()中具有P1.periodo”。P1.periodo也是一个group by 据我所知,GROUPBY用于非聚合字段。其中为非聚合字段 拥有是最奇怪的。。。“根据您已聚合的内容进行筛选”>您尚未聚合P1.periodo,但如果这是一个问题,则错误消息在某种程度上是决定性的 如果数据库支持它,我会考虑调试和可见性来查看CTE(公共表表达式)。(不确定最新的MySQL) 如果它不支持,请尝试使用视图。。。这里有相当多的代码都引用了相同的两个表。也许最好生成一个数据集,然后根据需要连接它。我认为这会使事后的过滤更容易 凝灰岩告诉没有实际连接到数据库,但可能是这样的东西。另外,我会给所有东西都加上别名,因为告诉什么列在什么表中是很困难的
with temp as (
/* Setup common table expression with basically all the info we need If your
* DBMS doesn't support common table expressions (CTE's) then put this in a
* view, or a temp table? */
select
t1.id_empresa as id_empresa ,
t1.periodo as periodo ,
t2.id_delegacion as id_delegacion ,
t2.monto as monto
from
cuotasindical.pagos as t1 inner join
cuotasindical.empresa as t2 on t1.id_empresa = t2.id_empresa and t2.id_delegacion = 5
)
select
t1.id_empresa as id_empresa ,
max(t1.ultimoPeriodo) as ultimoPeriodo,
min(t2.anteriorPeriodo) as anteriorPeriodo,
sum(t3.ultimoMonto ) as ultimoMonto ,
sum(t4.anteriorMonto) as anteriorMonto
from
(select id_empresa, max(periodo) as ultimoPeriodo from temp) as t1 inner join
(select id_empresa, min(periodo) as anteriorPeriodo from temp) as t2 on t1.id_empresa = t2.id_empresa inner join
(select id_empresa, periodo, sum(monto) as ultimoMonto from temp) as t3 on t1.id_empresa = t3.id_empresa and t1.ultimoPeriodo = t3.periodo inner join
(select id_empresa, periodo, sum(monto) as anteriorMonto from temp) as t4 on t1.id_empresa = t4.id_empresa and t2.anteriorMonto = t4.periodo inner join
where
.....
group by
t1.id_empresa
having
.....
谢谢你的回答。。谷歌搜索发现的问题,是子查询中的级别范围问题;mysql只支持一个级别:(