我现在正在使用slope One进行推荐。
如何从结果中排除访问过的项目?
我不能简单地通过not in (visited_id_list)
来过滤那些访问过的,因为它会对旧用户产生可扩展性问题!
我提出了一个没有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 :(得分:1)
说真的,如果您使用的是MySQL,请查看12.2.10.3. Subqueries with ANY, IN, and SOME
例如:
SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
这在我看过的所有MySQL版本中都可用,虽然手册中的部分编号在旧版本中有所不同。
编辑以回应OP的评论:
好的...... SELECT id FROM t1 WHERE ... AND NOT id IN (SELECT seen_id FROM user_seen_ids where user = ? )
之类的东西怎么样。此表单避免了必须在SQL语句中传递数千个ID。
如果你想完全避免在查询中对“id列表”进行“测试”,我不会在理论上看到它是如何实现的,更不用说如何实现它了。