繁体   English   中英

MYSQL-左联接可从数据库表中收集帖子和喜欢/评论

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM