2017-08-14 57 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