K先生个人博客

当前位置:首页 > 爱技术 > 正文

来聊聊mysql单表评论系统怎么设计

评论系统对于一个网站来说几乎是必不可少的,当然评论系统的设计也多种多样。一般情况下,评论数据表会和一个用户信息表结合使用,就是在评论表中记录的有用户id(例如user_id),然后查询评论数据的时候根据这个user_id去查询这条评论的用户信息。但是对于没有用户注册登录功能的网站来说,也就没有所谓的用户信息表了,相信这样的网站不在少数,如果你的网站也没有用户信息表的话,但你也想要做评论系统,那你可以好好读一下这篇文章哦。

评论表的数据库设计

由于是单表评论系统,也就是说就这一张表就够了。看完下面这张评论表的设计,你会对这个mysql单表评论系统更加熟悉。

mysql单表评论系统中评论表的设计

看完上图评论表的设计,相信你对博主说的这个单表评论系统有了解了。

单表评论系统怎么查询数据

可能你会有一张表怎么查数据的疑问,当然这也许对于你小事一桩,那这就更好了。

如果只是简单一层评论,那查询确实不是什么事,但今天博主要说的事一个楼中楼(多级)评论系统,不知道多级评论的,回想一下百度贴吧或者微博的评论吧。如果你想到了,那么现在你再想一想,应该怎么查询评论系统的数据呢?

有一种通法是,先查询出评论表中的一级评论,然后再for循环查询出该一级评论的二级评论,这样的方法当然也能把评论数据查询出来,但是如果至于几条、几十条评论,这样查其实也没什么,但如果评论数据有成千上万呢?查个评论会调用多少次数据库?这样的方法是不是要把数据库给搞崩?

一条sql语句查出所有你要的评论数据

就这一张评论表,我要怎么才能一句sql查出所有评论数据呢?

我们需要查出的数据格式,大概是下面这样的:

一句sql查出所有评论数据结果

就是二级回复(json格式)在对应父级评论下面。相信到这,已经很少有人能写出这样的一句sql了。

下面博主就不卖关子了,直接把sql语句贴上了,

SELECT com.username,com.content,com.created_at time,com.zan_num,GROUP_CONCAT(CONCAT('{"username":"',rep.username,'","replay_name":"',com.username,'","content":"',rep.content,'","time":"',rep.created_at,'","zan_num":"',rep.zan_num,'"}'))AS replayData FROM ml_comments com LEFT  JOIN ml_comments rep ON com.id=rep.replay_id WHERE com.replay_id=0 AND com.article_id=1 GROUP BY com.id

上面sql如果有不太了解的可以自行百度科普,其实也没啥难点,多看看就行了。

当然还有一种方法,请继续往下看。

通过算法处理成自己想要格式的评论数据

这个方法也很简洁,但也有点死脑细胞,,,直接查询出该文章下的所有评论,并且是不做啥处理的查询,咱们是查询出来在处理,获得我们所需要的评论数据,下面是php的处理方法:

$newDatas=$datas;
foreach ($datas as $k=>$v){
    if ($v['replay_id']!=0){
        //二级回复处理,把对应的回复接到一级回复        
        $key=found_Key($newDatas,'id',$v['replay_id']);
        $newDatas[$key]['replaydata'][]=$newDatas[$k];
        unset($newDatas[$k]);
    }else{$newDatas[$k]['replaydata']=array();}
}
//获取对应数组键值
function found_Key($arr,$f_key,$f_value){
    return array_search($f_value, array_column($arr, $f_key));
}

上面的$datas变量是我们查询出来的数据数组。思路就是chul循环遍历结果集,对二级评论进行处理,怎么处理呢?就是发现二级评论就把这条评论记录接到对应的父级评论上去,最后还得把这个二级评论在一级评论中删除。思路就是这样,道友们,自己参悟吧。

看完这篇文章,你可以试试博主的评论系统哦。还有一点就是,如果你感觉博主的评论还不错的话,哈哈,你也可以拥有!github链接:https://github.com/pmb2020/zxcomment这个GitHub是静态的html文件,需要你自己写后台接口对接哦。如果你有其他疑问,欢迎留言。

作者K先生本文地址http://www.gold404.cn/

版权声明:本文为原创文章,版权归 K先生个人博客 所有,欢迎分享本文,转载请保留出处,谢谢!

文章评论
* 必填项
可选
可选
评论列表