如何修复此MySQL查询?

时间:2008-12-01 18:41:34

标签: mysql

SELECT 
  avg(con_hits) as avg_hits 
FROM 
  content 
WHERE 
  con_type = 1 
  AND con_posttime < $twelve_hrs_ago 
  AND con_refresh = 0 
ORDER BY 
  con_posttime DESC 
LIMIT 100

我希望它转到至少12小时前发布的第一条记录(由具有合适时间戳的$twelve_hrs_ago变量表示),并取con_hits列的平均值,接下来的100条记录。在我的示例中,它忽略LIMIT,并取表中每条记录的平均值。

有没有办法绕过它?

2 个答案:

答案 0 :(得分:12)

在计算LIMIT后,

AVG将应用于结果集。您可以使用子选择执行您想要的操作:

SELECT avg(con_hits) as avg_hits
FROM (
  SELECT con_hits
  FROM content
  WHERE
    con_type = 1
    AND con_posttime < $twelve_hrs_ago
    AND con_refresh = 0
  ORDER BY con_posttime DESC
  LIMIT 100
) x;

您也可以使用数据库计算时间偏移量。将以上$twelve_hrs_ago替换为:

date_add(now(), interval -12 hour)

答案 1 :(得分:1)

怎么样:


SELECT avg(con_hits) as avg_hits FROM (
    SELECT con_hits FROM content 
    WHERE con_type = 1 AND con_posttime < $twelve_hrs_ago AND con_refresh = 0
    ORDER BY con_posttime DESC
    LIMIT 100
    ) 

Mysql支持子查询,所以这可能会为你做。

http://dev.mysql.com/doc/refman/5.0/en/subqueries.html