【问题标题】:MySQL: Average rating per item, using latest rating for userMySQL:每个项目的平均评分,使用用户的最新评分
【发布时间】:2017-08-14 15:47:12
【问题描述】:

我的items_ratings 表如下:

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;

我不确定应该如何组合这些查询来产生我想要的结果。

【问题讨论】:

标签: mysql average greatest-n-per-group


【解决方案1】:

您可以使用由 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创建的最大值,另一个获取macht的所有行,外部根据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

【讨论】:

  • 在我看来,这里的建筑太多了。
  • 嗯...当我运行它时,我似乎得到了正确的值,尽管结果不可靠。有时它给我一个item_id,有时更多。
  • 如果条件不变......应该返回相同的值......你的意思是“有时它给我一个 item_id,有时更多。” ?...
  • 随着更多数据被输入到同一item_id 和其他人的表中,此查询会产生截然不同的结果(省略item_id 与表中的值)
  • 是的,但是当该项目有可计算的平均值时,它会忽略 item_id。我希望查询产生所有item_id 的平均值,并在表中给出评分。
猜你喜欢
  • 2016-03-28
  • 1970-01-01
  • 2021-02-15
  • 2013-02-06
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多