我有一个评分表,其中每个用户每天可以添加一个评级。但每个用户可能会错过评级之间的几天。MySQL - 为B列的前N个条目选择列A的平均值
我想要得到平均rating
为每user_id
的前7条created_at
。
我的表:
mysql> desc entries;
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| rating | tinyint(4) | NO | | NULL | |
| user_id | int(10) unsigned | NO | MUL | NULL | |
| created_at | timestamp | YES | | NULL | |
+------------+------------------+------+-----+---------+----------------+
理想我只希望得到的东西,如:
+------------+------------------+
| day | average_rating |
+------------+------------------+
| 1 | 2.53 |
+------------+------------------+
| 2 | 4.30 |
+------------+------------------+
| 3 | 3.67 |
+------------+------------------+
| 4 | 5.50 |
+------------+------------------+
| 5 | 7.23 |
+------------+------------------+
| 6 | 6.98 |
+------------+------------------+
| 7 | 7.22 |
+------------+------------------+
我已经能够获得最接近的是:
SELECT rating, user_id, created_at FROM entries ORDER BY user_id asc, created at desc
其中ISN一点都不太接近...
它甚至有可能吗?表演会很糟糕吗?这是每次加载网页时都需要运行的东西,那么每天只运行一次并保存结果会更好吗? (另一个表!?)
编辑 - 第二次尝试
争取解决工作,我认为这将得到的评价每个用户的第一天:
select rating from entries where user_id in
(select user_id from entries order by created_at limit 1);
,但我得到:
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
所以现在我打算玩JOIN
看看是否有帮助。
编辑 - 第三次尝试,越来越近
I found this stackoverflow post,这更接近我想要的东西。
select e1.* from entries e1 left join entries e2
on (e1.user_id = e2.user_id and e1.created_at > e2.created_at)
where e2.id is null;
它获得每个用户第一天的评分。
下一步是弄清楚如何获得第2到7天。我不能使用1.created_at > e2.created_at
,所以我现在非常困惑。
编辑 - 第四次尝试
好吧,我认为这是不可能的。有一次,我摸索出如何“通过整组”模式,关闭,我意识到我可能会需要使用子查询与limit <user_id>, <day_num>
,为此,我得到:
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
我目前的方法是只得到了整个表,并使用PHP来计算每天的平均值。
你会在这里需要行号,以及日历表中缺少的天,以填补一个给定的用户,他们应该发生。 –
好的,谢谢 - 你是说在表中添加一个day_number列?不知道你的日历表是什么意思。如果user1在1月1日和次年1月2日第一次发布,而user2在3月1日和8月1日之后首先发布,那么无论发生什么时候,我都需要所有用户第一天和第二天的平均评分。 –
缺少日期必须来自_somewhere_,因为它们不在您的原始表格中。行号也必须来自某个地方。 –