2017-08-14 1 views
-1

J'ai la table items_ratings comme suit:MySQL: Note moyenne par article, en utilisant la dernière note pour les utilisateurs

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 | 
+----+--------+---------+---------+---------------------+ 

je dois récupérer la valeur moyenne par item_id, en utilisant la plus récente note de chaque utilisateur.

Ce qui suit me donne la note moyenne pour chaque élément:

SELECT AVG(rating) FROM items_ratings 
GROUP BY item_id 

J'ai également identifié que la requête suivante me donne la dernière ligne pour chaque user_id, par item_id. Je ne suis pas sûr de la façon dont je devrais combiner ces requêtes pour obtenir le résultat désiré.

+0

Voir: [Pourquoi devrais-je fournir un MCVE pour ce qui me semble être une très simple requête SQL?] (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

Répondre

0

Vous pouvez utiliser une sélection de table de jointure avec max créée par 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 

L'intérieur select obtenir le maximum créé par user_id, l'autre obtenir toutes les lignes macht et l'extérieur Buil la moyenne sur cette groupe par item_id

et avec la votre nouvelle condition sur item_id vous pouvez utiliser

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

Trop de choses se passent ici à mon avis. – Strawberry

+0

Hm ... quand je lance ceci, il me semble obtenir des valeurs correctes, bien qu'un résultat peu fiable. Parfois, cela me donne un item_id, parfois plus. –

+0

si la condition ne change pas .. devrait revenir toujours les mêmes valeurs .. que voulez-vous dire par "Parfois, il me donne un item_id, parfois plus." ? ... – scaisEdge