2017-08-14 55 views
-1

我有items_ratings表如下:MySQL的:每個項目的平均評分,採用最新的評級用戶

items_ratings 
+----+--------+---------+---------+---------------------+ 
| id | rating | user_id | item_id | created (DATETIME) | 
+----+--------+---------+---------+---------------------+ 
| 1 | 20  | 1  | 12  | 2017-07-12 14:00:04 | 
| 2 | 80  | 2  | 12  | 2017-07-12 15:32:12 | 
| 3 | 50  | 1  | 15  | 2017-08-01 11:14:04 | 
| 4 | 90  | 1  | 12  | 2017-08-02 19:23:19 | 
| 5 | 60  | 2  | 15  | 2017-08-05 19:23:19 | 
+----+--------+---------+---------+---------------------+ 

我需要爲每個item_id檢索的平均值,使用每個用戶最近的評級。

下面給我的平均得分爲每個項目:

SELECT AVG(rating) FROM items_ratings 
GROUP BY item_id 

我也確定了以下查詢給了我最近的行爲每個user_id,通過item_id

SELECT MAX(created), user_id, item_id FROM items_ratings 
GROUP BY user_id, item_id; 

我不確定如何結合這些查詢來產生我想要的結果。

+0

,即可查看新的條件組:[爲什麼要我爲了什麼,在我看來是一個非常簡單的SQL查詢提供MCVE?](HT TPS://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query) – Strawberry

回答

0

你可以使用從加入表創建最多一個選擇由USER_ID

select item_id, avg(rating) from (
     select * from items_ratings a 
     inner join (
     SELECT MAX(created) t_created, user_id 
     FROM items_ratings 
     GROUP BY user_id 
     ) t on t.user_id = a.user_id and t.t_created = a.created 
    ) t1 
    group by item_id 

內選擇獲取由USER_ID創建的最大,其他的獲得所有的行是馬赫特和外BUIL在這個平均通過ITEM_ID

,並與ITEM_ID你可以使用

select item_id, avg(rating) from (
     select * from items_ratings a 
     inner join (
     SELECT MAX(created) t_created, user_id, item_id 
     FROM items_ratings 
     GROUP BY user_id, item_id 
     ) t on t.user_id = a.user_id and t.t_created = a.created and t.item_id = a.item_id 
    ) t1 
    group by item_id 
+0

在我看來這裏圍繞着太多的建設。 – Strawberry

+0

嗯...當我運行這個,我似乎得到正確的值,雖然是一個不可靠的結果。有時它會給我一個'item_id',有時候會更多。 –

+0

如果條件不變,應該返回相同的值..你是什麼意思,「有時它給了我一個item_id,有時更多。」 ?... – scaisEdge