[英]MYSQL - Left join to gather posts and likes/comments from database tables
我目前正在制作一个供稿页面,其意图是将所有帖子,喜欢和评论都放在一个页面上。 我有三个不同的表。 一则包含帖子,一则包含喜欢,一则包含评论。
所有帖子都可以正确显示和显示。 但是,当一个帖子被2个或更多人喜欢时,就会出现问题,它还会在Feed中复制该帖子2次或更多次。 下面是我的代码:
$findShouts = $pdo->prepare('
SELECT f.id
, f.username
, f.name
, f.text
, f.timestamp
, l.likesUsername
, c.commentsUsername
, c.commentsName
, c.commentsText
, c.commentsTimestamp
FROM feed f
LEFT
JOIN feedLikes l
ON l.likesFeedID = f.id
LEFT
JOIN feedComments c
ON c.commentsFeedID = f.id
WHERE f.name IN (SELECT scoutingUsername
FROM scout
WHERE scoutedUsername =?
OR scoutingUsername =?)
ORDER
BY f.timestamp DESC
');
//execute query and variables
$findShouts->execute([$username, $username]);
if ($findShouts->rowCount() > 0)
{
//get the shouts for each scout
while($row = $findShouts->fetch(PDO::FETCH_ASSOC)){
$shoutID[] = $row['id'];
$shoutUsername[] = $row["username"];
$shoutName[] = $row["name"];
$shoutText[] = $row["text"];
$shoutTimestamp[] = $row["timestamp"];
$likesUsername[] = $row['likesUsername'];
$commentsUsername[] = $row["commentsUsername"];
$commentsName[] = $row["commentsName"];
$commentsText[] = $row["commentsText"];
$commentsTimestamp[] = $row["commentsTimestamp"];
}
$shoutCount = count($shoutUsername);
for($indexShout=0; $indexShout < $shoutCount; $indexShout++) {
//show post data
}
}
我的Feed数据库中只有2个帖子,在feedLikes中,第一个帖子有两个赞。 但是,第一篇文章显示两次。
如果我print $shoutUsername
我希望只有2个结果(每个帖子一个),但是显示3,因为第一个帖子的2个print $shoutUsername
正在创建同一帖子的2个。
感谢您的任何帮助。
您可以合并所有数据,同时选择并在以后使用PHP进行解析。 不是完成任务的最佳方法,但值得一试:
SELECT f.id
, f.username
, f.name
, f.text
, f.timestamp
, Group_concat(l.likesUsername order by l.likesUsername separator ',') as likesUsername
, Group_concat(c.commentsUsername order by c.commentsUsername separator ',') as commentsUsername
, Group_concat(c.commentsName order by c.commentsUsername separator ',') as commentsName
, Group_concat(c.commentsText order by c.commentsUsername separator ',') as commentsText
, Group_oncat(c.commentsTimestamp order by c.commentsUsername separator ',') as commentsTimestamp
FROM feed f
LEFT
JOIN feedLikes l
ON l.likesFeedID = f.id
LEFT
JOIN feedComments c
ON c.commentsFeedID = f.id
WHERE f.name IN (SELECT scoutingUsername
FROM scout
WHERE scoutedUsername =?
OR scoutingUsername =?)
Group by f.id // added group by
ORDER
BY f.timestamp DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.