1

我现在使用斜率一进行推荐。

如何从结果中排除访问过的项目?

我不能简单地通过not in (visited_id_list)过滤那些访问过的来做到这一点,因为它会对老用户产生可伸缩性问题!

我想出了一个没有的解决方案not in:</p>

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;
4

1 回答 1

1

说真的,如果您使用的是 MySQL,请查看12.2.10.3。带有 ANY、IN 和 SOME 的子查询

例如:

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

这在我查看的所有 MySQL 版本中都可用,尽管手册中的节号在旧版本中有所不同。

编辑以回应OP的评论:

  1. 好的......怎么样SELECT id FROM t1 WHERE ... AND NOT id IN (SELECT seen_id FROM user_seen_ids where user = ? )。这种形式避免了在 SQL 语句中传递数千个 id。

  2. 如果您想完全避免查询的“针对 id 列表进行测试”部分,我看不出它在理论上是如何实现的,更不用说您将如何实现它了。

于 2010-01-18T14:06:16.637 回答