在我的一个 PHP/MySQL 站点上,每个用户都可以阻止站点上的所有其他用户。这些块存储在一个Blocked
表中,每一行代表谁进行了阻塞以及谁是块的目标。这些列被索引以便更快地检索用户的整个“阻止列表”。
对于每个用户,我们必须从任何搜索结果中排除出现在其阻止列表中的任何用户。
为了做到这一点,最好是:
1)在用户登录时生成“阻止列表”,方法是在登录时查询Blocked
表一次并将其保存到$_SESSION
(并在他们更改“阻止列表”并将其重新保存到时重新查询$_SESSION
) ,然后这样查询:
NOT IN ($commaSeparatedListFromSession)
或者
2)通过对每个用户的搜索查询使用子查询,直接在查询中“实时”排除被阻止的用户:
NOT IN (SELECT userid FROM Blocked WHERE Blocked.from = $currentUserID)
?