我有一個評分表,其中每個用戶每天可以添加一個評級。但每個用戶可能會錯過評級之間的幾天。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_,因爲它們不在您的原始表格中。行號也必須來自某個地方。 –