在我的一个PHP/MySQL网站上,每个用户都可以阻止网站上的其他用户。这些块存储在Blocked
表中,每行代表谁执行了阻止,谁是该块的目标。这些列被索引以更快地检索用户的整个“阻止列表”。
对于每个用户,我们必须从任何搜索结果中排除任何出现在其阻止列表中的用户。
为了做到这一点,是它更好地:
1)生成了“阻止列表”,每当用户通过登录查询Blocked
表一次,并把它保存在$_SESSION
登录(和它重新查询他们做出改变他们的“阻止列表”和任何时间重新保存至$_SESSION
),然后查询这样:
NOT IN ($commaSeparatedListFromSession)
或
2)排除在“实时”直接在通过使用一个子查询为每个用户的搜索查询作为这样查询中的被阻止的用户:
NOT IN (SELECT userid FROM Blocked WHERE Blocked.from = $currentUserID)
?
继续子选择。让数据库做好自己擅长的事情:即尽早过滤。另外,一个好的数据库不会因为你将它重新构建为JOIN而变得更慢。因此,除非您发现数据库无法以更直观的形式处理查询,否则请勿这样做。 – 2013-04-26 15:14:21