在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是正确的解决方案。