-1

さまざまなユーザーがコメントを投稿するコメント投稿システムがあります。また、サブコメント機能もあります。この機能では、ユーザーがサブコメントを追加したり、サブコメントを削除したりすることもできます。

すべてのコメントとサブコメントを、親IDフィールドを持つmain_reviewsという名前の1つのテーブルに格納します。これにより、コメントとサブコメントを検出します。メインコメントの親ID値は0ですが、サブコメントの親ID値はIDであり、その親ID値はサブコメントです。

したがって、php関数mysql_fetch_array()を使用してページにすべてのコメントとサブコメントを表示する場合、1つのクエリを使用してすべてのコメントとサブコメントを並べ替えたいと思います。私は次のクエリを使用しました:

mysql_query( "select * from main_reviews where p_id = 0 order by id desc");

これにより、すべての正しいデータが表示されます。しかし、ひねりはここにあります。すべてのコメントをそのサブコメントと一緒に並べ替えたいのです。つまり、ユーザーがサブコメントを投稿すると、その特定のサブコメントとそのメインコメントがFacebookのように上部に表示されます。

したがって、「union」または「in」句などを使用するかどうかに関係なく、どのクエリを生成する必要があります。これにより、サブコメントが後で投稿された場​​合でも、すべてのコメントがサブコメントとともに並べ替えられます。

そして、申し訳ありませんが、文法上の間違いがある場合は、私は英語以外の国から来ています。

4

4 に答える 4

0

あなたの最善の策は2つのクエリだと思います(トップレベルのコメントにしか返信できないと仮定します)。

コメントを取得する

SELECT * FROM comments WHERE parent_id = 0 ORDER BY date DESC

サブコメントの取得:

SELECT * FROM WHERE parent_id <> 0 ORDER BY parent_id ASC, DATE DESC

その後、PHP内でサブコメントを簡単に関連付けることができます。

別の注意点として、私はNULL、ではなく、親の投稿がないことを示すために使用します0

于 2012-07-24T08:35:06.307 に答える
0

あなたが正しいと理解していれば、次のようなものがあります。データを注文する必要がある投稿日を含む多くのサブコメントがあります。特定の注文について、最新の投稿日 (メイン投稿またはサブ投稿の投稿日) が必要です。

(短い表記: maincomment = mc 、subcomment = sc、mcid=is of mc、scid=id of sc)

次のように結果セットを再構築します。

$mc = array();
// Loop over resultset here
foreach ($resultset as $onecomment){
 $mcid = ..(fetch from id or parentid from $onecomment)..
 if (..is_subcomment..){
   // put in subcomment of the right mc
   $mc[$mcid]["subcomment"][] = $onecomment;
 } else {
   // this is a maincommant
   $mc[$mcid] = $onecomment;
 }
 // And ALWAYS store the postdate, be it from the subcomment, of maincomment,
 // but only if it is later than the current
 if (!isset($mc[$mcid]["lastpostdate"])){
    // first, always store
    $mc[$mcid]["lastpostdate"] =  $onecomment["postdate"];
 } else {
    // Only store if this one is bigger
    if (strtotime($onecomment["postdate"]) > strtotime($mc[$mcid]["lastpostdate"])){
         // overwrite
         $mc[$mcid]["lastpostdate"] =  $onecomment["postdate"];
    }
 }
}

これで、各投稿の最後の投稿日が保存されました。$mc[$mcid]["lastpostdate"] を使用して、配列を lastpostdate に注文できるようになりました。このような再構築の一般的な考え方は、重要な情報 (postdate) を配列のメイン エントリにリンクすることです。

于 2012-07-24T08:35:39.473 に答える
0

1つのクエリでそれを行うと考えることができる唯一の方法は、すべてのコメントにコメントのparent_idを持たせて、0ではなく独自のIDを持たせ(おそらくcomment_idなどに名前を変更します)、次にparent_idで並べ替え、次に日にち。あまり正規化されていませんが、そうすれば 1 つのクエリで実行できます。

于 2012-07-24T08:30:46.217 に答える
0

構造上の観点からは、コメントとサブコメントを同じテーブルに含めない方がよいでしょう。私はそれらを2つのテーブルに分けて、次のようなものを持っています

Table comments
id (int,primary,auto increment)
body (text)
date (datetime)

Table subcomments
id (int,primary,auto increment)
comment_id (int,foreign key)
body (text)
date (datetime)

この構造を使用すると、クエリを起動してコメントとそれに応じたサブコメントを取得できます。id 1 のコメントがあると想像してください。

$query="SELECT * FROM subcomments WHERE comment_id=1 ORDER BY date DESC";
$result=mysql_query($query);

ORDER BY date DESC、最新のサブコメントを最初に表示します。

すべてのコメントとサブコメントを一度に取得するには、次のようなものを使用します

SELECT * FROM comments,subcomments WHERE comments.id=subcomments.comment_id ORDER BY comments.date,subcomments.date
于 2012-07-24T08:23:27.073 に答える