1

让我先设置一下情况。

我有一个带有 X 字段的“用户”表,除了“可见性”之外,这些字段对我的问题并不重要。Visibility 是一个 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是每页的项目数

我想在 SQL 中做的是$num从 users 表中获取用户,如果他们的可见性字段为 = 0 或 1。但是,如果可见性标志为 1,我需要确保用户 id 和 $requester 是朋友表中的朋友并且只有当他们是朋友时才返回该用户。

我想在我得到结果后使用 PHP 过滤可见性,但是如果我要求 5 条记录并且一个或多个用户的可见性设置为 1 并且不是请求者的朋友,那么分页(限制)将会被搞砸. 这几乎必须完全通过 sql 完成。

可能的??

4

2 回答 2

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);
于 2012-04-17T13:46:24.670 回答
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
于 2012-04-17T11:36:48.337 回答