Mysql 在单个响应/查询中获取不同日期范围的平均评分
因此,我有4个单独的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
-- 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天内没有收到任何评级,他们可能不应该在表中:)