2014-07-08 202 views
1

我想用SUM()和LIMIT做一个子查询。这与以下代码正常工作:MySQL子查询SUM限制

SELECT id, 
    (
     SELECT SUM(number) 
     FROM (
      SELECT number 
      FROM t2 
      WHERE u_id = '1' 
      ORDER BY time ASC 
      LIMIT 30 
     ) AS temp 
    ) AS test 
FROM t1 

但我想这样做,当然动态和当前行ID。 我改变了查询到以下几点:

SELECT id, 
    (
     SELECT SUM(number) 
     FROM (
      SELECT number 
      FROM t2 
      WHERE u_id = p.id 
      ORDER BY time ASC 
      LIMIT 30 
     ) AS temp 
    ) AS test 
FROM t1 p 

这将提供以下错误:

Unknown column 'p.id' in 'where clause' 

任何想法如何使它工作?

+2

请提供样本数据和预期输出。 – Uriil

回答

0

不幸的是,MySQL限制了表别名的范围。 Oracle是另一个数据库。

您可以短语查询作为一个复杂的联接:

select t1.id, sum(t2.number) 
from t1 p join 
    t2 
    on p.id = t2.u_id 
where 30 >= (select count(*) 
      from t2 t22 
      where t22.u_id = t2.u_id and 
        t22.time <= t2.time 
      ) 
group by t1.id; 

或者你可以通过使用变量做到这一点:

select p.id, sum(number) 
from t1 p join 
    (select t2.*, 
      @rn := if(@u = t2.u_id, @rn + 1, if((@u := t2.u_id) is not null, 1, 0)) as rn 
     from t2 
      (select @u := 0, @rn := 0) vars 
     order by t2.u_d, time 
    ) t2 
    on p.id = t2.u_id 
where rn <= 30 
group by p.id; 
0

为什么不只是将p.id更改为t1.id?我很确定这是因为你在第一次选择时将t1混淆了,并且它没有在子查询中定义。尝试一个内部连接。

SELECT id, 
    (
     SELECT SUM(number) 
     FROM (
      SELECT number 
      FROM t2 
      INNER JOIN t1 p 
      on u_id = p.id 
      ORDER BY time ASC 
      LIMIT 30 
     ) AS temp 
    ) AS test 
FROM t1 p 
+0

没有区别。 – Dev0r

+0

内部连接不工作? –

0

试试这个:

SELECT id, temp2.sum_number as test 
FROM t1 p 
INNER JOIN 
(
    SELECT SUM(number) as sum_number, temp.u_id 
     FROM (
      SELECT number, u_id 
      FROM t2 
      WHERE u_id = p.id 
      ORDER BY time ASC 
      LIMIT 30 
     ) AS temp 
) AS temp2 ON temp2.u_id = p.id 

我感动的子查询连接部分,所以我可以访问子查询中的p.id。