Mysql 在单个响应/查询中获取不同日期范围的平均评分

Mysql 在单个响应/查询中获取不同日期范围的平均评分,mysql,Mysql,因此,我有4个单独的MySQL查询用于获得评级: -- Get average rating for this week, and a count of each rating select my_user as Login, EXTRACT(WEEK from (update_date)) as 'WeekNo', COUNT(CASE WHEN rating = 1 THEN 1 ELSE NULL END) AS '1-Stars', COUNT(CAS

因此,我有4个单独的MySQL查询用于获得评级:

    -- Get average rating for this week, and a count of each rating
    select my_user as Login, EXTRACT(WEEK from (update_date)) as 'WeekNo', 
    COUNT(CASE WHEN rating = 1 THEN 1 ELSE NULL END) AS '1-Stars', 
    COUNT(CASE WHEN rating = 2 THEN 1 ELSE NULL END) AS '2-Stars', 
    COUNT(CASE WHEN rating = 3 THEN 1 ELSE NULL END) AS '3-Stars',
    COUNT(CASE WHEN rating = 4 THEN 1 ELSE NULL END) AS '4-Stars',
    COUNT(CASE WHEN rating = 5 THEN 1 ELSE NULL END) AS '5-Stars', 
    round(avg(rating),2) as 'WeekAvg' 
    from rating_table where my_user IN ('u1','u2','u3')  
    AND EXTRACT(YEAR from (update_date)) = 2016 
    AND EXTRACT(WEEK from (update_date)) = (WEEKOFYEAR(NOW()) - 1)
    GROUP BY 1 ORDER BY 1;

    -- get the average rating for the past 90 days
    SELECT my_user as 'Login', round(avg(rating),2) as '90-day' 
    FROM rating_table
    WHERE update_date BETWEEN NOW() - INTERVAL 90 DAY AND NOW() 
    AND my_user in ('u1','u2','u3') 
    GROUP BY 1;

    -- get the average rating for Year to date
    SELECT my_user as 'Login', round(avg(rating),2) as 'YTD' 
    FROM rating_table 
    WHERE (update_date BETWEEN '2016-01-01 00:00:00' AND NOW())
    AND my_user in ('u1','u2','u3') 
    GROUP BY 1;

    -- get the average rating for the past 365 days
    SELECT my_user as 'Login', round(avg(rating),2) as '365-day' 
    FROM rating_table
    WHERE update_date BETWEEN NOW() - INTERVAL 365 DAY AND NOW() 
    AND my_user in ('u1','u2','u3') 
    GROUP BY 1;
我尝试了各种方法将它们放到一个查询/表中,但我就是无法让它们工作。以下是我希望输出的显示方式:

    +----------+--------+---------+---------+---------+---------+---------+---------+--------+------+---------+
    | Agent    | WeekNo | 1-Stars | 2-Stars | 3-Stars | 4-Stars | 5-Stars | WeekAvg | 90-day | YTD  | 365-day |
    +----------+--------+---------+---------+---------+---------+---------+---------+--------+------+---------+
    | u1       |     26 |       0 |       0 |       0 |       0 |       6 |    5.00 |   5.00 | 5.00 |    5.00 |
    | u2       |     26 |       0 |       0 |       0 |       1 |       9 |    4.90 |   4.90 | 4.90 |    4.90 |
    | u3       |     26 |       0 |       0 |       0 |       0 |       1 |    5.00 |   5.00 | 5.00 |    5.00 |
    +----------+--------+---------+---------+---------+---------+---------+---------+--------+------+---------+
我试过:

  • 从中选择*(第一季度、第二季度等)
  • 嵌套选择查询
  • 使用不同日期范围的子查询
这些查询是针对只读表运行的,因此我只能使用有限的方法


我知道我离答案很近了,但它对我来说并不合适。有人能就此提供一些建议吗?

您是否尝试使用LEFT JOIN

提示:


你有没有试着用LEFT JOIN来做

提示:


您只需将它们作为不同的子查询进行连接:

Select * from 
  (Select * from ... /*your 1st query*/ ) t1
 Join (Select * from ... /*your 2nd query*/ ) t2 
    on t1.Login=t2.login
 Join (Select * from ... /*your 3rd query*/ ) t3
    on t1.Login=t3.login
 Join (Select * from ... /*your 4th query*/ ) t4
    on t1.Login=t4.login

您只需将它们作为不同的子查询进行连接:

Select * from 
  (Select * from ... /*your 1st query*/ ) t1
 Join (Select * from ... /*your 2nd query*/ ) t2 
    on t1.Login=t2.login
 Join (Select * from ... /*your 3rd query*/ ) t3
    on t1.Login=t3.login
 Join (Select * from ... /*your 4th query*/ ) t4
    on t1.Login=t4.login

那么你输出到MySQL控制台了吗?我在控制台中测试是的,你输出到MySQL控制台了吗?我在控制台中测试是的,这有点有效,除了每个平均数字之间都有“Login”列明白了-谢谢!我需要使用列名,而不是选择*@AlexFarrington(很高兴我能帮上忙:)而且(不确定是否重要)当我使用365天的login+数据作为最左边的两列时,效果最好。如果过去一周/90天/YTD中没有数据,这种方式将显示空值。如果有人在过去365天内没有收到任何评分,他们可能不应该出现在表中:)这种方法很有效,除了每个平均数字之间都有“登录”列明白了-谢谢!我需要使用列名,而不是选择*@AlexFarrington(很高兴我能帮上忙:)而且(不确定是否重要)当我使用365天的login+数据作为最左边的两列时,效果最好。如果过去一周/90天/YTD中没有数据,这种方式将显示空值。如果有人在过去365天内没有收到任何评级,他们可能不应该在表中:)