2014-01-08 74 views
0

就像我上面说过的,我有两个问题就在这里。两个PHP查询avgs拉相同的结果。为什么?

$avg = "SELECT avg(CASE WHEN Lasttrade = 0 THEN NULL ELSE Lasttrade END) FROM $month 
     ORDER BY ID DESC LIMIT 0, 25"; 


$avg = "SELECT avg(CASE WHEN Lasttrade = 0 THEN NULL ELSE Lasttrade END) FROM $month 
     ORDER BY ID DESC LIMIT 0, 5"; 

我在单独的时间运行它们,使用

$result = $db->query($avg) or die ("avg t1 "); 

,但他们拉了相同的结果。我想拉平最后5分和最后25分的平均值。但我得到的确切数字相同。有什么想法吗?

+0

多少条记录你在你的数据库有哪些? –

+1

您的'LIMIT'在您的_total resultset_上,它只有1行,因为如果您省略了任何'GROUP BY',那么您将累加整个表。你可能想要一个带'LIMIT'的_subquery_和带'AVG()'的外部查询。 – Wrikken

+0

120-140张桌子。在每个50-60行,5列左右总数 – Nice1013

回答

2

LIMIT只限制从您的查询返回给您的行数。它不限制查询/计算中使用的行。您需要使用WHERE子句或子查询(取决于您确切需要的)。

+0

我想最后5,最后10 – Nice1013

+0

请参阅@ Wrikken上面的评论如何做到这一点 –

0

约翰指出,“为什么”已经,LIMIT行为对结果集,而不是查询过程,但这里是你需要如何做到这一点,限制了记录通过子查询要平均:

SELECT avg(CASE WHEN Lasttrade = 0 THEN NULL ELSE Lasttrade END) 
    FROM (SELECT *    FROM $month 
      ORDER BY ID DESC 
      LIMIT 0, 25") AS sub; 
0

您的查询返回一行,因为它是一个聚合查询。 limit是查询处理中的最后一个逻辑步骤 - 在聚合和order by子句之后。

尝试使用子查询限制行数:

SELECT avg(CASE WHEN Lasttrade <> 0 THEN Lasttrade END) 
FROM (select m.* 
     from $month m 
     ORDER BY ID DESC LIMIT 0, 25 
    ) m 
相关问题