3

私はこれが数回前に尋ねられたことを知っています、しかし私はこのサイトですべての答えを試しました、そしてまだどこにも行きません。

投稿をループアウトしてから、フィード内の各投稿に関連付けられたコメントをループアウトするTwitterタイプのフィードを作成しようとしています(Facebookと同様)。これを行うための最良の方法が2つの別々のクエリであるか、すべてを1つのクエリで行うか、またどのようにすべてをループアウトするかがわかりません。

私のデータベース構造は次のとおりです。

--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)

これは、JOINステートメントを使用するのが初めての私のSQLクエリの問題だと思います。これは私が私のクエリのために現在持っているものです

  "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"

誰かが助けることができますか?とても有難い?

4

1 に答える 1

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を使用する内部クエリの2つのクエリを記述します。

次のようになります。

$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
}

どちらの方法でも、最初は簡単ですがクエリが多くなり、2番目はより複雑ですがより効率的になります。

また、テーブルインデックスに基づく並べ替えについての最後の注意事項です。これは、ほとんどの場合、実行したいことではありません。PHPまたはSQLNOW()関数を介して設定されるタイムスタンプフィールドを追加する必要があります。

于 2012-04-25T07:30:17.593 に答える