Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用MySQL查询_Php_Mysql - Fatal编程技术网

在PHP中使用MySQL查询

在PHP中使用MySQL查询,php,mysql,Php,Mysql,我正在创建一个社交网络,你可以在其中跟随某人或与他们成为朋友。您能够看到的数据取决于您与用户的关系类型。现在我有两张桌子要用。帖子和关系 职位: | user_id | post_id | story | ----------------------------- | 1 | 1 | text. | ----------------------------- 关系: | rel_id | user_1 | user_2| status | -------------

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

职位:

| user_id | post_id | story |
-----------------------------
|  1      |  1      | text. |
-----------------------------
关系:

| rel_id  | user_1  | user_2| status |
--------------------------------------
|  1      |  1      |   2   |    3   |
--------------------------------------
我也有一个用户表,但我认为这在这里并不重要。所以,基本上我想从我的朋友或关注的用户那里选择所有帖子。用户_2始终是关系的收件人。数字1、2和3表示关系的“状态”。1表示您正在跟踪收件人,3表示您是朋友,4表示您正在跟踪收件人(唯一的区别是您还有一个待定的朋友请求)。我设置了一个SELECT查询,但它工作不正常

$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。我可能做错了什么?还有什么其他方法可以做到这一点


提前谢谢

这不是
的工作方式。也许你应该试试
中的

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

对于重复,请在
中使用
DISTINCT

您的
,其中
子句条件语法不正确。试着这样做:

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)
<?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();

?>
我建议您使用扩展

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

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)
<?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();

?>


记住要经常过滤你的输入,尤其是用于查询数据库的输入。

当他修复OR时,我认为重复会消失,因此他不需要进行区分。他得到了重复,因为“或3或1”使它匹配所有行,因为这些总是正确的。@Barmar:记录的重复通常来自于关系,而不是任何固定的比较。这一点很好。我认为只有当同一对用户以不同的状态多次出现在关系表中时,才会发生这种情况。在这种情况下,DISTINCT是正确的解决方案。