查询输出与 if 条件不一致
Posted
技术标签:
【中文标题】查询输出与 if 条件不一致【英文标题】:Query output not consistent to if condition 【发布时间】: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.'" >';
$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 条件不一致的主要内容,如果未能解决你的问题,请参考以下文章