0

我想创建一个新闻更新系统,使用 MySQL 和 PHP。但我不能让它工作,所以我可以显示新闻更新和所有附加的评论(然后一个有效的用户登录,这个人可以单独删除每条评论)。

我有这四个表和数据库架构

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_idcomments_id为NULL,然后用户写一条评论,news_comments_tbl设置comments_id一个id。

但是当评论超过一条时,新闻更新就会重复,所以它就像:

新闻 1
- 无评论

新闻 2
-1 评论
评论:
汤姆斯评论

新闻 3
-2 评论
评论:
约翰斯评论

新闻 3
-2 评论
评论:
艾伦评论

而且我要:

新闻 1
-0 评论

新闻 2
-1 评论
评论:
汤姆斯评论

新闻 3
-2 评论
评论:
Johns 评论
Allans 评论

我如何显示每个新闻更新和所有附加的评论?
我已经尝试过GROUP_CONCAT- 但是我无法获取每条评论的 ID,所以用户可以单独删除评论吗?
我也试过了GROUP BY news_tbl.news_id,但我只得到第一条评论?
我如何计算评论?我试过这个:

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

因为您要将新闻加入评论,所以每一行都将包含新闻和其中一条评论。

您可能会发现在一个查询中选择新闻并在第二个查询中获取评论更有效,因为您发送的数据比您需要的更多,因为连接。您需要测量它以查看它是否更快。

或者,您可以通过仅在检测到新 id 时编写一次新闻来在循环中处理此问题(您的查询已经具有按 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 回答