让我先说明情况。
我有一个带X字段的“用户”表,除了“可见性”之外,字段对我的问题并不重要。可见性是一个tinyint,值表示以下(0 =对所有人可见,1 =仅对朋友可见,2 =不可见)。
我还有一个朋友表(id, user_id, target_user_id)
。 user_id
是target_user_id
的朋友。到目前为止还够容易吗?
这是粘性的地方。我正在编写PHP API,我的类方法看起来像这样:
public function getUsers($requester, $page, $num) {}
$requester
是请求用户的用户ID $page
是分页页码$num
是每页的商品数如果可见性字段为= 0或1,我想在SQL中做的是从用户表中获取$num
个用户。如果可见性标志为1,我需要确保用户ID和$ requester是friends表中的朋友,只有当他们是朋友时才返回该用户。
我想在使用我的结果后使用PHP来过滤可见性,但是如果我要求5条记录,并且一个或多个用户的可见性设置为1并且不是朋友,那么分页(限制)将被搞砸与请求者。这几乎必须通过sql完成。
可能??
答案 0 :(得分:1)
尝试使用与用户相同的结构创建临时表'temp'。
select * into temp From users where visibility=0 or visibility=1;
Select * from temp, friends where (temp.visibility=0) or (temp.user_id = friends.target_user_id);
不要忘记清空临时表。
我没有尝试过第二个查询,让我知道你得到了什么输出。
select * from users, friends where (users.visibility=0) or (users.visibility=1 and users.user_id = friends.target_user_id);
答案 1 :(得分:0)
我认为你可以使用LEFT JOIN ......就像
"SELECT *
FROM users t1
LEFT JOIN friends t2 ON t2.user_id=t1.id AND t1.visibility=1
INNER JOIN user t3 ON t3.id=t2.target_user_id
WHERE t1.visibility=0 OR t1.visibility=1
LIMIT ".($page*$num).",".$num