如果被阻止,则不要包括在通配符搜索中

时间:2018-11-09 12:14:10

标签: php mysql

我在这里遇到问题

有两个用户

用户1 profile_id

3115267284

然后输入用户2的Profile_id

3028630039

有一个名为friends的表,其结构为

from_profile_id
to_profile_id
request
blocked_by

这是用户的数据和结构

var_id  profile_id  fullname             firstname   lastname
180     3115267284  John Louis Domincel  John Louis  Domincel  
181     3028630039  James Domincel       James       Domincel  
182     3450766778  asdasd asdsadas      asdasd      asdsadas

让我们说该“朋友”表的数据是

from_profile_id  to_profile_id  request  blocked_by
3028630039       3115267284     3        3115267284     

我使用此命令搜索数据

SELECT * FROM users 
WHERE fullname LIKE "%'.$s_final.'%" LIMIT 5

这是预览

enter image description here

我只想使profile_id 2为3028630039将无法搜索profile_id 1即3115267284,因为profile ID 1是阻止了两个的profile_id 1,但profile_id 1将能够搜索profile ID 2

我也尝试使用JOINISNOT(),但没有成功

2 个答案:

答案 0 :(得分:1)

假设您可能会被多个人阻止,我将在您的php代码中查询您的SQL数据库,并为运行搜索的用户提取所有blocked_by ID。然后,如果要查询的ID在列表中,我将进行遍历并在php代码中进行检查并停止该过程。

如果您真的在寻找效率,这可能不是最佳解决方案。我想您也可以运行查询,然后在php中进行检查,这样就不会执行2个查询。

也许其他人有一个纯粹的MySQL答案。

答案 1 :(得分:1)

假定执行搜索的用户的profile_id的变量名称为$searcher_profile_id

您可以使用Left Join来连接两个表。定义连接条件的方式是获取与“被阻止的用户”相对应的行。我们只需要考虑未被使用WHERE .. IS NOT NULL阻止的那些用户。有时也称为“反加入”:

SELECT u.* 
FROM users AS u 
LEFT JOIN friends AS f 
  ON f.blocked_by = u.profile_id AND 
     f.blocked_by <> "' . (int)$searcher_profile_id . '" AND 
     (
      f.to_profile_id = "' . (int)$searcher_profile_id . '" OR 
      f.from_profile_id = "' . (int)$searcher_profile_id . '"
     ) AND 
     f.request = 3
WHERE u.fullname LIKE "%'.$s_final.'%" AND 
      f.from_profile_id IS NULL 
LIMIT 5