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_id
andcomments_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>';
}