0

MySQLとPHPを使用してニュース更新システムを作成したいと思います。しかし、それを機能させることができないので、ニュースの更新と添付されたすべてのコメントを表示できます(その後、有効なユーザーがログインすると、その人は各コメントを個別に削除できます)。

私はこれらの4つのテーブルとDBスキーマを持っています

news_tbl (news_id, date, user (fk to users_tbl.username), headline, bodytext and picture)
users_tbl (username, email, password, usertype)
comments_tbl (comments_id, name, comment)
news_comments_tbl (news_comments_id, news_id_fk, comments_id_dk)

ユーザーがニュースの更新を書き込み、news_comments_tblそのセットにnews_idandcomments_idがNULLの場合、ユーザーはコメントに書き込み、IDをnews_comments_tbl設定します。comments_id

ただし、コメントが複数ある場合は、ニュースの更新が複製されるため、次のようになります。

ニュース
1-コメントなし

ニュース2-1
コメント
コメント:
トムズコメント

ニュース3-2
コメント
コメント:
ジョンズコメント

ニュース3-2
コメント
コメント:
Allansコメント

そして私は欲しい:

ニュース
1-0コメント

ニュース2-1
コメント
コメント:
トムズコメント

ニュース3-2
コメント
コメント:
ジョンズコメント
アランコメント

すべてのニュース更新とそれに添付されたすべてのコメントを表示するにはどうすればよいですか?
試しGROUP_CONCATましたが、各コメントのIDを取得できないため、ユーザーはコメントを個別に削除できますか?
Iv'eも試してみましGROUP BY news_tbl.news_idたが、最初のコメントしか得られませんか?
そして、どのようにコメントを数えるのですか?Iv'eはこれで試しました:

COUNT(comments_tbl.comments_id) AS count

しかし、それから私は最初に書かれたニュースしか得られませんか?!私はそれを機能させるために多くの時間を費やしましたが、それを理解できないようです:(誰かが私を助けてくれることを願っています

これは私の質問です:

$sqlquery ="SELECT news_tbl.*, news_comments_tbl.*, users_tbl.*, comments_tbl.* 
    FROM news_tbl
    LEFT JOIN news_comments_tbl ON news_comments_tbl.news_id_fk = news_tbl.news_id
    LEFT JOIN comments_tbl ON news_comments_tbl.comments_id_fk = comments_tbl.comments_id
    LEFT JOIN users_tbl ON users_tbl.username = news_tbl.user
    ORDER BY news_tbl.news_id DESC LIMIT 5";

これは私のPHPコードです:

        $result = $conn->query($sqlquery);


        foreach($result as $row)
        {
            $commentsidfk = $row['comments_id_fk'];
            $newsidfk = $row['news_id_fk'];

          if($row['comments_id_fk'] == NULL)
          {
              echo $row['headline'];
              echo '<br>';
              echo $row['bodytext'];
              echo '<br>';
          }
          if($row['comments_id_fk'] != NULL)
          {
              echo $row['headline'];
              echo '<br>';
              echo $row['bodytext'];

              echo '<br>';
              echo $row['comment'];
              echo '<br>';
              echo '<a href=delete.php?news_id='.$commentsidfk.' >Delete comment</a>';
              echo '<br>';

          }
              echo '<br>';
              echo '<a href=delete.php?news_id='.$newsidfk.' >Delete news</a>';
              echo '<br>';
        }
4

1 に答える 1

2

ニュースをコメントに結合しているため、各行にはニュースとコメントの 1 つが含まれます。

結合のために必要以上のデータを送信しているため、1 つのクエリでニュースを選択し、2 番目のクエリでコメントを取得する方が効率的である場合があります。測定して、速度が速いかどうかを確認する必要があります。

または、新しい ID を検出したときにニュースを 1 回だけ書き込むことで、ループ内でこれを処理することもできます (クエリには既に ID で並べられたものが含まれているため、順番に処理されることがわかります)。

    $currentNewsId = 0;


    foreach($result as $row)
    {
        $commentsidfk = $row['comments_id_fk'];
        $newsidfk = $row['news_id_fk'];

        if ($newsidfk != $currentNewsId) {
             // write the news out
             $currentNewsId = $newsidfk;
        }
        // ...
于 2012-12-16T22:54:04.380 に答える