我在这里遇到问题
有两个用户
用户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
这是预览
我只想使profile_id 2为3028630039将无法搜索profile_id 1即3115267284,因为profile ID 1是阻止了两个的profile_id 1,但profile_id 1将能够搜索profile ID 2
我也尝试使用JOIN
和ISNOT()
,但没有成功
答案 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