[英]Get average ratings for different date ranges in a single response / query
So I have 4 separate MySQL queries that I use to get ratings: 所以我有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;
I've tried various approaches to get these into a single query / table, but I just can't get these working. 我已经尝试了各种方法将它们放入单个查询/表中,但我无法让这些工作。 This is how I'd like the output to appear: 这就是我想要输出的方式:
+----------+--------+---------+---------+---------+---------+---------+---------+--------+------+---------+
| 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 |
+----------+--------+---------+---------+---------+---------+---------+---------+--------+------+---------+
I've tried: 我试过了:
These queries are run against a read-only table, so I am limited in the methods I can use. 这些查询是针对只读表运行的,因此我可以使用的方法受到限制。
I know I'm close to the answer, but it's just not clicking for me. 我知道我接近答案,但它不是为了点击我。 Anyone able to offer some advice on this? 有人能提出一些建议吗?
Did you try to do it with LEFT JOIN? 你试着用LEFT JOIN做的吗?
hint: 暗示:
FROM rating_table rt
LEFT JOIN rating_table as rt90 ON rt.my_user = rt90.my_user ...
LEFT JOIN rating_table as rtY ON rt.my_user = rtY.my_user ...
LEFT JOIN rating_table as rt365 ON rt.my_user = rt365.my_user ...
You can simply join them as different sub-query: 您可以简单地将它们作为不同的子查询加入:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.