1

我正在创建一个社交网络,您可以在其中关注某人或与他们成为朋友。您能够看到的数据取决于您与用户的关系类型。现在我有两张桌子可以使用。职位和关系。

帖子:

| user_id | post_id | story |
-----------------------------
|  1      |  1      | text. |
-----------------------------

关系:

| rel_id  | user_1  | user_2| status |
--------------------------------------
|  1      |  1      |   2   |    3   |
--------------------------------------

我也有一个用户表,但我认为这在这里并不重要。所以,基本上我想从我是朋友或关注的用户中选择所有帖子。User_2 始终是关系的接收者。数字 1、2 和 3 代表关系的“状态”。1 表示您正在关注收件人,3 表示您是朋友,4 表示您正在关注收件人(唯一的区别是您还有待处理的好友请求)。我设置了一个 SELECT QUERY 但它不能正常工作。

$query=" SELECT * FROM posts LEFT JOIN relationships ON (posts.user_id=    
relationships.user_2 AND relationships.user_1 = $user_id AND relationships.status = 4 
OR 3 OR 1)";

它会选择所有帖子,两次。这是为什么?我希望它只选择发布帖子的用户与我有关系的帖子,状态为 1、3 或 4。我可能做错了什么?还有什么其他方法可以做到这一点?

提前致谢!

4

2 回答 2

3

这不是如何OR工作的。也许你应该试试IN

... relationships.status IN (4, 3, 1) ...

至于重复,使用DISTINCT.

于 2012-08-12T04:30:13.250 回答
0

OR的 inWHERE子句条件的语法不正确。尝试这样的事情:

SELECT  * 
FROM    posts a 
            LEFT JOIN relationships b
                ON a.user_id = b.user_2 
WHERE   b.user_1 = $user_id AND 
        b.status IN (1,3,4)

我建议你使用PDOMYSQLi扩展。

在 PDO 中,它可能如下所示:

<?php
$stmt = $dbh->prepare("SELECT   * 
                      FROM  posts a 
                           LEFT JOIN relationships b
                                ON a.user_id = b.user_2 
                     WHERE  b.user_1 = ? AND 
                            b.status IN (1,3,4)");

$stmt->bindParam(1, $user_id);
$stmt->execute();

?>

请记住始终过滤您的输入,尤其是用于查询数据库的输入。

于 2012-08-12T04:34:17.450 回答