MYSQL:在不使用子查询的情况下,如何将算术表达式指定为SELECT子句中字段的值?

MYSQL:在不使用子查询的情况下,如何将算术表达式指定为SELECT子句中字段的值?,mysql,sql,Mysql,Sql,这是我的疑问: SELECT DISTINCT id, stat, date, user_id FROM data AS T1 WHERE 2.0 >= ( SELECT avg1 FROM ( SELECT stat, AVG(value) AS avg1 FROM data WHERE date > SUBTIME(NOW(), MAKETIME(168, 0, 0))

这是我的疑问:

SELECT DISTINCT id, stat, date, user_id
FROM data AS T1
WHERE 2.0 >= (
         SELECT avg1
         FROM (
            SELECT stat, AVG(value) AS avg1
            FROM data
            WHERE date > SUBTIME(NOW(), MAKETIME(168, 0, 0))
            GROUP BY stat_name) b1
         WHERE stat = T1.stat
         AND id = T1.id)/
         (
         SELECT avg2
         FROM (
            SELECT stat, AVG(value) AS avg2
            FROM cata
            WHERE date > SUBTIME(NOW(), MAKETIME(336, 0, 0))
            AND date <= SUBTIME(NOW(), MAKETIME(168, 0, 0))
            GROUP BY stat) b2
         WHERE stat = T1.stat
         AND id = T1.id)
ORDER BY id;
我的想法是创建一个统计表,本周的平均值是上周平均值的两倍多

我的问题是:我想为每个统计数据选择一列diff_values,它代表本周的最大值-上周的最大值,代表过去一周的增长。基本上,今天统计的条目是昨天的统计加上增长。如果不创建两个子查询(类似于WHERE子句中的子查询),我想不出一种方法来实现它,但是这样做会使查询执行时间非常长,因为数据是一个相当大的表


有没有办法在现有子查询之间进行数学分割?

如果我正确理解了您的查询,那么您正在尝试计算本周和上周每个用户的每个统计数据的平均值

如果是,以下查询将以更简单的方式执行此操作:

select stat, user_id,
       avg(case when date > SUBTIME(NOW(), MAKETIME(168, 0, 0)) then value end) as thisweek,
       avg(case when date > SUBTIME(NOW(), MAKETIME(336, 0, 0)) AND date <= SUBTIME(NOW(), MAKETIME(168, 0, 0)) then value end) as lastweek
from data
group by stat, user_id
having 2.0 >= thisweek / lastweek

它使用条件聚合来计算每个平均值,使用您当时的逻辑-我没有改变这一点。然后它使用having子句进行比较。

哇,这可以更快、更紧凑地完成我想做的事情。谢谢