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

42fyovps  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(578)

我这里有个问题,
有两个用户
用户1配置文件\u id

3115267284

然后用户2配置文件\u 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

假设friends表的数据是

from_profile_id  to_profile_id  request  blocked_by
3028630039       3115267284     3        3115267284

我使用这个命令来搜索数据

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

这是预览

我只想使配置文件2,这是3028630039将无法搜索配置文件1,这是3115267284原因配置文件id 1是谁阻止了两个,但配置文件1将能够搜索配置文件id 2
我也试过使用 JOIN 以及 ISNOT() 但没有成功

k0pti3hp

k0pti3hp1#

假设有人被多人阻止,我会在php代码中查询sql数据库,并为运行搜索的用户提取所有被阻止的id。然后,我将遍历并检查php代码,如果所查询的id在列表中,则停止该过程。
如果你真的在寻找效率,这可能不是最好的解决方案。我想您也可以运行查询,然后在php中执行检查,这样就不会执行2个查询。
也许其他人有一个纯粹的答案。

lyfkaqu1

lyfkaqu12#

假设执行搜索的用户的profile\u id的变量名为 $searcher_profile_id .
你可以用 Left Join 把两张table连接起来。连接条件的定义是为了得到对应于“blocked user”的行。我们只需要考虑那些没有被阻止的用户 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

相关问题