【发布时间】:2017-04-13 21:34:48
【问题描述】:
我遇到了一个我无法弄清楚的问题。我正在做一个 SELECT 查询来显示用户的朋友。我正在加入用户、朋友和 profile_img 表以获取用户信息、他们的个人资料图片和朋友关系。
在朋友表中,如果friend_one 和friend_two 的status 为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_img 和 friend_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.'" alt="Friend Image">';
$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>';
}
【问题讨论】:
-
我不确定你到底在问什么?在我的页面 (friend_1) 上显示我的朋友 (friend_2、3 等) 的所有数据?
-
如果我在 id 为 1 的用户页面上(参见上面的示例).. 唯一的输出应该来自用户 5。我的页面上的输出显示用户 5 为
$friend_one, 但用户名和 img 来自用户 1。
标签: php mysql if-statement pdo foreach