相关文章推荐阅读(标签)
2018-06-22 05:27:46来源:未知 阅读 ()
最近在写文章的管理, 发现网上关于 "相关文章推荐" 的资料比较少, 于是自己写了一个, 初稿, 代码未经优化, 实现搜索相同(相似)标签的文章, 比如搜索 "深入" 也是可以搜到"深入浅出"的.
如果是多个标签, 本文会(遍历标签)每次只对一个标签进行搜索, 达到两条数据即返回.
后来发现可以用多次 like 查询, 来减少对数据库的查询, 代码在文章的最下面 ,
如有更好的搜索方法, 欢迎共同讨论
相关文章 标签相关, 剔除本身的id
本人比较随意, 写的文章比较丑, 大家别太在意
用的Yii 框架, sql语句可能不一样, 自己改改吧~!
/** * * @param 标签 $label * @param 文章ID $article_id * @return 文章相关字段 */ public function getRelated($label,$article_id) { //传入的标签数量 $num = count($label); //多个标签 开始 if($num>1) { $Article = array(); for($i=0;$i<$num;$i++) { $arr = Article::find() ->select(['article_id','title','summary','create_time']) ->where(['status'=>1]) ->andwhere(['<>','article_id',$article_id]) ->andwhere([ 'or', ['like','label',$label[$i]], ]) ->asArray(true) ->orderBy('create_time desc') ->limit(2) ->all(); $Article = array_merge($Article,$arr); $num1 = count($Article); if($num1 > 1) { return $Article; } } //如果查到的文章不足两篇, 就随便去一篇最新的补上, if(count($Article)<2) { $Article2 = Article::find() ->select(['article_id','title','summary','create_time']) ->where(['status'=>1]) ->andwhere(['<>','article_id',$article_id]) ->asArray(true) ->orderBy('create_time desc') ->limit(2) ->all(); $Article = array_merge($Article,$Article2); $Article = array_slice($Article,0,2); return $Article; } return $Article; } //多个标签 结束 //如果只有一个标签, 从这里开始,到最后结束 $Article1 = Article::find() ->select(['article_id','title','summary','create_time']) ->where(['status'=>1]) ->andwhere(['<>','article_id',$article_id]) ->andwhere([ 'or', ['like','label',$label], ]) ->asArray(true) ->orderBy('create_time desc') ->limit(2) ->all(); //如果查到的文章不足两篇, 就随便去一篇最新的补上, //这里重复了, 可以自己优化一下 if(count($Article1)<2) { $Article2 = Article::find() ->select(['article_id','title','summary','create_time']) ->where(['status'=>1]) ->andwhere(['<>','article_id',$article_id]) ->asArray(true) ->orderBy('create_time desc') ->limit(2) ->all(); $Article = array_merge($Article1,$Article2); $Article = array_slice($Article,0,2); return $Article; } return $Article1; }
这里用的是多个 like 拼接的sql 语句, 每次查询时对比多条标签, 但是不太懂这样的效率会不会比之前高, 毕竟之前虽然是遍历查询, 但是多数情况下, 并不是走完完整个循环
public function getRelated($label,$article_id) { //传入的标签数量 $label = explode(',',$label); $num = count($label); //多个标签 开始 if($num>1) { $Article = array(); $like = ''; for($i=0;$i<$num;$i++) { $like .= "label LIKE '%{$label[$i]}%' OR "; } $like = rtrim($like,'OR '); $sql = "SELECT article_id,title,summary,create_time From xm_articles WHERE status=1 and article_id!={$article_id} and ({$like}) ORDER BY create_time DESC limit 2"; $Article = \Yii::$app->dbofficial ->createCommand($sql) ->queryAll(); $num1 = count($Article); //查到两篇就返回 if($num1 > 1) { return $Article; } //如果查到的文章不足两篇, 就随便拿一篇最新的补上, $Article2 = Article::find() ->select(['article_id','title','summary','create_time']) ->where(['status'=>1]) ->andwhere(['<>','article_id',$article_id]) ->asArray(true) ->orderBy('create_time desc') ->limit(2) ->all(); $Article = array_merge($Article,$Article2); $Article = array_slice($Article,0,2); return $Article; } //多个标签 结束 //如果只有一个标签, 从这里开始,到最后结束 $Article = Article::find() ->select(['article_id','title','summary','create_time']) ->where(['status'=>1]) ->andwhere(['<>','article_id',$article_id]) ->andwhere([ 'or', ['like','label',$label], ]) ->asArray(true) ->orderBy('create_time desc') ->limit(2) ->all(); //如果查到的文章不足两篇, 就随便去一篇最新的补上, //这里重复了, 可以优化一下 if(count($Article)<2) { $Article2 = Article::find() ->select(['article_id','title','summary','create_time']) ->where(['status'=>1]) ->andwhere(['<>','article_id',$article_id]) ->asArray(true) ->orderBy('create_time desc') ->limit(2) ->all(); $Article = array_merge($Article,$Article2); $Article = array_slice($Article,0,2); return $Article; } return $Article; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:总结一些PHP文件函数有哪些
下一篇:Git学习总结(一)
- 五款PHP代码重构工具推荐 2020-03-01
- php连接mssql的一些相关经验及注意事项 2019-10-17
- 全面讲解PHP中多进程编程的相关函数 2019-09-17
- 汇总php上传文件的相关问题 2019-08-23
- 推荐四个phpstorm酷炫实用插件 让你写代码的时候不在孤单! 2019-07-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash