使用MYSQL和PHP循环出流后和相关注释

时间:2012-04-25 07:03:23

标签: php mysql comments feed timeline

我知道之前已经问了几次,但是我已经尝试了这个网站上的所有答案,但我仍然没有在哪里。

我正在尝试创建一个Twitter类型的Feed,它会循环播放这些帖子,然后为Feed中的每个帖子循环出相关的评论(类似于Facebook)。我不确定执行此操作的最佳方法是两个单独的查询还是一个查询中的所有查询以及如何将其全部循环?

我的数据库结构如下:

--TWEETS--              --COMMENTS--          --USERS--
id                      id                    id
accountno               accountno             accountno
userid                  userid                email
createdat               createdat             name
tweet                   tweetid 
image                   comment

我的PHP功能如下:

function gettweets(){

$result = mysql_query("SELECT tweets.id,tweets.tweet,tweets.createdat,tweets.userid,users.name,users.avatar,users.biog FROM tweets INNER JOIN users ON tweets.userid = users.id WHERE tweets.accountno ='123456' ORDER by tweets.ID DESC LIMIT 20");

while($row = mysql_fetch_array( $result )) {
  $name = $row['name'];
  $biog = $row['biog'];
  $avatar = $row['avatar'];
  $newtweet= $row['tweet'];
  $tweetid = $row['id'];
  $timeago = ago($row['createdat']);
  $thistweet = '';
  $thistweet .= "<div class='tweet' data-tweetid='$tweetid'>";
  $thistweet .= "<div class='left'>";
  $thistweet .= "<img width='45' height='45' src='$avatar' alt='placeholder+image'>";
  $thistweet .= "</div><!-- / -->";
  $thistweet .= "<div class='right'>";
  $thistweet .= "<span class='name'>$name says</span>";
  $thistweet .= "<p>";
  $thistweet .= "$newtweet";
  $thistweet .=  "</p>";
  $thistweet .= "<span class='replybar'> $timeago <a class='like' data-tweetid='$tweetid' href='' title=''>Like</a> | "; 
$thistweet .= "<a class='favourite' data-tweetid='$tweetid' href='' title=''>Favourite</a> | ";
$thistweet .= "<a class='mainreply' href='' title=''>Reply</a></span>";

//I WANT TO LOOP OUT THE COMMENTS HERE 


$thistweet .= "</div><!-- / --><span class='clear'></span></div><!--End Tweet -->";
return $thistweet;
} 

}

**编辑* * *

我已经尝试了以下关于创建它的方法的答案,我现在成功地使用每条推文下方的相关评论来圈出“推文”。不过我的问题是它正在为我的特定推文的每一条评论循环出我的“推文”,即

tweet 1
   -comment 1.1
tweet 1
   -comment 1.1
   -comment 1.2 (Tweet 1 has 2 comments so loops out tweet 1 two times)
tweet 2
   -comment 2.1
tweet 2
   -comment 2.1
   -comment 2.2
tweet 2
   -comment 2.1
   -comment 2.2
   -comment 2.3 (Tweet 2 has 3 comments so loops out tweet 2 three times)

我认为这是我的SQL查询的问题,因为我是使用JOIN语句的新手。这是我目前的查询

  "SELECT tweets.accountno, tweets.id,tweets.tweet,tweets.createdat,tweets.userid,users.name,users.avatar,users.biog,comments.comment FROM tweets INNER JOIN users ON tweets.userid = users.id JOIN comments ON tweets.id = comments.tweetid WHERE tweets.accountno ='123456' ORDER by tweets.ID DESC LIMIT 20"

有人能帮忙吗?非常感谢?

1 个答案:

答案 0 :(得分:2)

首先,我确保您的查询返回您的期望。一个很好的工具是phpMyAdmin。

但是,如果我理解你的问题,你想要的是:

Tweet1
    Comment1 about Tweet1
    Comment2 about Tweet1
Tweet2
    Comment1 about Tweet2
    Comment2 about Tweet2
    Comment3 about Tweet2
Tweet3
    Comment1 about Tweet3
(etc.)

如果是这样,有两种主要方法可以做到这一点:

简单,效率低下的方式

编写2个查询,一个外部查询和一个使用外部查询中的tweetid的内部查询。

它可能看起来像:

$qo = "SELECT * FROM tweet ORDER by tweets.ID"
$ro = mysql_query($qo);
while($ao = mysql_fetch_array($ro)
{
    // DISPLAY THE TWEET HERE
    $qi = sprintf("SELECT * FROM comments WHERE tweetid = %d", ao['id']);
    $ri = mysql_query($qi);
    while($ai = mysql_fetch_array($ri)
    {
        //DISPLAY THE COMMENT HERE
    }
}

更复杂,更有效的方式

使用像您一样的联接,然后循环搜索结果,跟踪推文ID是否已更改。如果有,请显示推文。

因此,假设您的查询是正确的:

$query  = "SELECT tweets.id,tweets.tweet,tweets.createdat,tweets.userid,users.name,users.avatar,users.biog FROM tweets INNER JOIN users ON tweets.userid = users.id WHERE tweets.accountno ='123456' ORDER by tweets.ID DESC LIMIT 20";
$result = mysql_query($result);

$tweetid = -1;  // Some impossible tweetid
while($row = mysql_fetch_array( $result )) {
    if($row['id'] != $tweetid){ 
        // PRINT TWEET
        $tweetid = $row['id'];
    }
    // PRINT COMMENT
}

无论哪种方式都可以让你到达你想要的地方,第一种方式更容易,但涉及更多的查询,第二种方式更复杂但效率更高。

另外,关于基于表索引进行排序的最后一点说明 - 这几乎不是你想要做的。您应该添加一个时间戳字段,该字段可以通过PHP或SQL NOW()函数设置。