【问题标题】:Using a MySQL query with PHP在 PHP 中使用 MySQL 查询
【发布时间】:2012-08-12 04:24:42
【问题描述】:

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

帖子:

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

提前致谢!

【问题讨论】:

    标签: php mysql


    【解决方案1】:

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

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

    至于重复,使用DISTINCT

    【讨论】:

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

    WHERE 子句条件中的 OR 语法不正确。试试这样的:

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 2017-04-03
      • 2013-10-05
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2013-08-31
      相关资源
      最近更新 更多