查询输出与 if 条件不一致

Posted

技术标签:

【中文标题】查询输出与 if 条件不一致【英文标题】:Query output not consistent to if condition 【发布时间】:2017-04-13 21:34:48 【问题描述】:

我遇到了一个我无法弄清楚的问题。我正在做一个 SELECT 查询来显示用户的朋友。我正在加入用户、朋友和 profile_img 表以获取用户信息、他们的个人资料图片和朋友关系。

在朋友表中,如果friend_onefriend_twostatus 为2,则表示他们是朋友。这是我的查询正在检查的内容,然后将其他表连接在一起以检索其他数据,例如用户名和图像。

查询似乎工作正常。但另一方面,我的输出却不是应该的。

在我的朋友表中,如果您正在查看第 2 行(参见下面的插入),friend_one 为 5,friend_two 为 1。但是,当我尝试输出朋友列表时,我的查询获取了这两个用户的数据,我只想显示与我正在查看的用户个人资料关联的朋友列表。因此,如果我在朋友 1 的个人资料页面上,我要显示的数据仅适用于朋友 5。

CREATE TABLE `friends` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `friend_one` int(11) NOT NULL DEFAULT '0',
 `friend_two` int(11) NOT NULL DEFAULT '0',
 `status` enum('0','1','2') COLLATE utf8_unicode_ci DEFAULT '0',
 `date` datetime NOT NULL,
 PRIMARY KEY (`id`),
 KEY `friend_two` (`friend_two`)
);

INSERT INTO `friends`
VALUES 
(1, 1, 2, 2, NOW()),
(2, 5, 1, 2, NOW())
;

我尝试了一个 if 语句来继续通过与我所在的个人资料用户页面匹配的朋友数据,它适用于 friend_1 输出......它会显示 1,但它不会为friend_imgfriend_username

有谁知道为什么它对$friend_1 有效,但对其余数据无效?图片和用户名正在输出个人资料用户的数据,它应该是相反的,只是他们的朋友数据。

    $friend_status = 2;
    $friend_sql = "
    SELECT f.*,
        u1.*,
        u2.*,
        p1.*,
        p2.*,
        IFNULL(p1.img, 'profile_images/default.jpg') AS img1,
        IFNULL(p2.img, 'profile_images/default.jpg') AS img2
    FROM friends f
    LEFT JOIN users u1 ON u1.id = f.friend_one 
    LEFT JOIN users u2 ON u2.id = f.friend_two
    LEFT JOIN (
        SELECT user_id, max(id) as mid
        FROM profile_img
        GROUP BY user_id
    ) max1 ON u1.id = max1.user_id
    LEFT JOIN (
        SELECT user_id, max(id) as mid
        FROM profile_img
        GROUP BY user_id
    ) max2 ON u2.id = max2.user_id
    LEFT JOIN profile_img p1 ON p1.user_id = f.friend_one and p1.id = max1.mid
    LEFT JOIN profile_img p2 ON p2.user_id = f.friend_two and p2.id = max2.mid
    WHERE (friend_one = :profile_user or friend_two = :profile_user)
            AND status = :total_status
    ";
    $friend_stmt = $con->prepare($friend_sql);
    $friend_stmt->execute(array(':profile_user' => $profile_user, ':total_status' => $friend_status));
    $friend_total_rows = $friend_stmt->fetchAll(PDO::FETCH_ASSOC);
    $count_total_friend = $friend_stmt->rowCount();
?>  
            <div id="friend-list-container">
                <div id="friend-list-count">Friends <span class="light-gray"><?php echo $count_total_friend; ?></span></div>
                <div id="friend-list-image-container">
<?php
    foreach ($friend_total_rows as $friend_total_row) 
        $friend_1           = $friend_total_row['friend_one'];
        $friend_2           = $friend_total_row['friend_two'];
        $friend_img_src     = $friend_total_row['img'];
        $friend_img         = '<img src="'.$friend_img_src.'" >';
        $friend_username    = $friend_total_row['username'];
        if($friend_1 !== $profile_user) 
            echo '<div class="friend-list-block">
                    <div class="friend-list-block-img">' .
                    $friend_img .
                        '<div class="friend-list-block-details">'. $friend_1 . " "
                    . $friend_username .
                '</div></div></div>';

        

Fiddle

【问题讨论】:

我不确定你到底在问什么?在我的页面 (friend_1) 上显示我的朋友 (friend_2、3 等) 的所有数据? 如果我在 id 为 1 的用户页面上(参见上面的示例).. 唯一的输出应该来自用户 5。我的页面上的输出显示用户 5 为 $friend_one , 但用户名和 img 来自用户 1。 【参考方案1】:

如果我正确理解您的要求,我认为您正在寻找:

SELECT u.*, p.img
FROM users u
LEFT JOIN (
        SELECT user_id, max(id) as mid
        FROM profile_img
        GROUP BY user_id
    ) mid ON u.id = mid.user_id
LEFT JOIN profile_img p ON p.id = mid.mid
WHERE u.id in (
    SELECT friend_one FROM friends WHERE friend_two = 1 AND status = 2
    UNION
    SELECT friend_two FROM friends WHERE friend_one = 1 AND status = 2 
    );

好的,这里是 PHP 部分的更新...

<?php
    foreach ($friend_total_rows as $friend_total_row) 
        $friend_id          = $friend_total_row['id'];
        $friend_img_src     = $friend_total_row['img'];
        $friend_img         = (!empty($friend_img_src)) ? '<img src="'.$friend_img_src.'" >' : '';
        $friend_username    = $friend_total_row['username'];
            echo '<div class="friend-list-block">
                    <div class="friend-list-block-img">' .
                    $friend_img .
                        '<div class="friend-list-block-details">'. $friend_id . " "
                    . $friend_username .
                '</div></div></div>';

    

【讨论】:

我的查询没问题,输出错误...我认为问题源于我的 if 条件。 不,您的查询由于其结构方式而试图获取太多信息。返回您的 Fiddle 并查看返回的重复列。 PHP 将选择它看到的最后一个带有“img”标签的。所有 U1.*、U2.*、P1.*、P2.* 都会抓取字段的副本。简化查询以仅检索您需要的内容。此外,减少所有这些 JOIN 将加快查询速度。 嗯。好吧,您的查询以某种方式有所帮助,但也对其造成了伤害。它现在可以获取正确的用户信息,但我需要其中的最大 id 才能仅获取最新的 profile_img。 @Paul 我更新了上面的查询。这应该与具有最高 ID 的图像匹配。 我对查询和答案中的 PHP 进行了更改。

以上是关于查询输出与 if 条件不一致的主要内容,如果未能解决你的问题,请参考以下文章

Python:循环中对 IF 语句的不一致处理

分布式系统——并发条件下如何保证缓存与DB数据一致性

Django orm字符串与数字比较导致数据不一致

7.属性名与查询字段名不相同

Mybatis中输出映射resultType与resultMap的区别

Hibernate 查询数据为何和数据库不一致?