关于mysql连表查询的问题
来源:1-2 Swoole简介
singwa
2018-04-03
各位小伙伴,大家好, 最近在swoole课程群里面有小伙伴在咨询有关连表查询的一些事情,其实连表查询在实际工作中,特别是中型以上的公司基本不建议用连表查询的 原因我汇总如下:
1、你要做连表查询的话,后续不太好维护
2、当数据大的时候连表查询很影响性能,除非万不得已的时候才用连表
场景:
比如你要查询文章的信息,并且是分页列表展示,然后文章里面还有其他的内容比如栏目等,但是文章表里面的栏目肯定存的是栏目表的主键ID, 但是在平台中展示文章列表的时候肯定是需要展示栏目的名称的,那这个时候很多工程师基本是使用关联连表查询比比如 left join等的。但是实际上不建议这样来做。 作法如下:
1、取出文章的内容(比如第一页的时候 展示 20条内容) ,放到一个数组里面;
2、并且把这数据中栏目id放到 另外一个数组里面 需要去重处理, 然后在拿到这些id 去栏目表里面 in查询下,1条sql。不是多个sql
3、查询后组织下栏目的数据 id=>name的关系
4、在列表展示的时候 循环文章的数组、展示栏目的时候就可以拿到3中的对应关系对上。
其他场景:
待编辑......
写回答
4回答
-
kingofzihua
2018-04-04
这个,laravel中 关联模型 with 就是这样的
40 -
singwa
提问者
2018-04-03
留下您的脚步
20 -
不吃鱼的喵儿
2018-04-09
$lists = $this->post->getResult(['uid'=>$this->d['uid'],'state'=>2], $f='*',$size,$offset)->result(); $content_id = array(); foreach ($lists as $val){ $content_id[] = $val->content_id; //content_id变为数组 $val->pic = explode('|', $val->pic); $val->comment_list = array(); // 评论列表 $val->parise = 0; // 点赞数 } if (empty($content_id)) { $data['list'] = $lists; } else { $reply = array(); //ci框架的查询语句,放到模型里了,就是简单的sql语句 $replyResult = $this->comment->getWhereIn(['state'=>2],'comment_id,from_username,to_username,comment,content_id,to_uid,create_time,from_uid',$content_id)->result(); foreach ($replyResult as $item) { $reply[$item->content_id][] = $item; } $parise = array(); $pariseResult = $this->parise->getContentIdsPariseNumber(array('content_id'=>$content_id))->result(); foreach ($pariseResult as $pr) { $parise[$pr->content_id] = $pr->num; } foreach ($lists as $val){ $val->comment_list = empty($reply[$val->content_id]) ? array() : $this->getReplyList($reply[$val->content_id]); $val->parise = empty($parise[$val->content_id]) ? 0 : $parise[$val->content_id]; } } $data['list'] = $lists;
10 -
不吃鱼的喵儿
2018-04-09
公司代码就是这样,先查一个表的所有信息,然后,foreach循环出来,把需要的数组放到一个字段里, 然后,下一个表查询的时候,用where in查询。最后合并数据
10
相似问题