有评论的新闻数据库,如何摆脱重复 - 用mysql和PHP?

时间:2012-12-16 22:37:19

标签: php mysql database

我想使用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_tblnews_idcomments_id的设置为NULL,则用户会撰写评论,news_comments_tbl设置{{1带有id。

但是当有多个评论时,新闻更新会重复,所以它就像:

新闻1
- 没有评论

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

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

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

我想要:

新闻1
-0评论

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

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

如何显示每条新闻更新及其附带的所有评论? 我已经尝试了comments_id - 但是我无法获取每条评论的ID,因此用户可以单独删除评论吗?
我也试过GROUP_CONCAT,但后来才得到第一个评论? 我如何计算评论?我试过这个:

GROUP BY news_tbl.news_id

但后来我才得到第一个书面新闻?!我花了很多时间试图让它工作,但似乎无法弄清楚:(希望有人可以帮助我

这是我的疑问:

COUNT(comments_tbl.comments_id) AS count

这是我的PHP代码:

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

1 个答案:

答案 0 :(得分: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;
        }
        // ...