2010-01-18 6 views
1

J'utilise maintenant slope One pour la recommandation.Comment exclure automatiquement les éléments déjà visités dans l'algorithme de recommandation?

Comment exclure les éléments visités du résultat?

Je ne peux pas le faire simplement par not in (visited_id_list) pour filtrer ceux qui sont visités car il aura un problème d'évolutivité pour un vieil utilisateur!

Je suis venu avec une solution sans not in:

select b.property,count(b.id) total from propertyviews a 
             left join propertyviews b on b.cookie=a.cookie 
             left join propertyviews c on c.cookie=0 and b.property=c.property 
             where a.property=1 and a.cookie!=0 and c.property is null 
             group by b.property order by total; 
+0

Implémentez-vous cela dans SQL? Si non, comment vos données sont-elles stockées? Si vous extrayez toutes les données, si vous les traitez et que vous les présentez ensuite, vous avez des problèmes plus importants. – pestilence669

+0

Oui, je l'implémente dans MySQL. – user198729

Répondre

1

Sérieusement, si vous utilisez MySQL, regardez 12.2.10.3. Subqueries with ANY, IN, and SOME

Par exemple:

SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2); 

Il est disponible Dans toutes les versions de MySQL, j'ai regardé, même si les numéros de section dans le manuel sont différents dans les anciennes versions.

EDIT en réponse au commentaire de l'OP:

  1. OK ... Que diriez-vous quelque chose comme SELECT id FROM t1 WHERE ... AND NOT id IN (SELECT seen_id FROM user_seen_ids where user = ?). Cette forme évite d'avoir à passer des milliers d'identifiants dans l'instruction SQL.

  2. Si vous voulez éviter complètement la partie "test contre une liste d'identifiants" de la requête, je ne vois pas comment c'est possible en théorie, et encore moins comment vous l'implémenteriez.