2012-04-25 1 views
3

これは数回前に尋ねられましたが、私はこのサイトのすべての回答を試しています。MYSQLとPHPを使用してポストストリームとそれに関連するコメントをループします

私は、投稿をループし、フィード内の各投稿(Facebookに似ています)に関連するコメントをループする、Twitterタイプのフィードを作成しようとしています。私はこれを行う最善の方法が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; 
} 

} 

**私は「EDIT * * *

私はそれを作成する方法に関して以下の答えを試しましたが、私はいませんそれぞれのつぶやきの下の関連するコメントと共に「つぶやき」をループすることを成功裏に管理する。しかし、私の問題は、私は、これは文のJOIN使用する新しいイムとしての私のSQLクエリでの問題だと思う、それはすなわち

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) 

その特定のつぶやきのために私が持っているコメントのあらゆる数のための私の「つぶやき」を行うループしているということです。これは私のクエリで現在持っているものです

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

誰でも手助けできますか?とても有難い?

答えて

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つのクエリ、外部クエリ、および外部クエリからのツイートを使用する内部クエリを書き込みます。つぶやきかどうかを追跡する、あなたは、結果によって、ループをやっているよう

使用が参加

$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()関数で設定されたタイムスタンプフィールドを追加するべきです。

+0

ありがとうございます。それは意味をなさないようです。後で私が家に帰るときに2番目のオプションを試してみます。私は3つのテーブルから取得するために必要なので、私はSQLクエリを再加工する必要があるかもしれないと思う。ユーザー、ツイート、コメント。ありがとう:-) –

+0

任意のアイデアをお願いしますか? –

+0

複数のコメントがある場合にツイートが複数回表示されるようにしたい、またはしたくないと言っていますか?たとえば、ツイートに3つのコメントがある場合は、「TWEET、COMMENT1、COMMENT2、COMMENT3」または「TWEET、COMMENT1、TWEET、COMMENT2、TWEET、COMMENT3」にしますか? – jedwards

関連する問題