zoukankan      html  css  js  c++  java
  • 相关文章推荐阅读(标签)

      最近在写文章的管理, 发现网上关于 "相关文章推荐" 的资料比较少, 于是自己写了一个, 初稿, 代码未经优化, 实现搜索相同(相似)标签的文章,   比如搜索 "深入" 也是可以搜到"深入浅出"的.

      如果是多个标签, 本文会(遍历标签)每次只对一个标签进行搜索, 达到两条数据即返回. 

      后来发现可以用多次  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;
        }
  • 相关阅读:
    Linq 入门 顺带 Func与Action
    关于asp.net 的一些好资料地址 , 防止丢失!
    Sql日期时间格式转换 备用
    自己动手写 ASP.NET MVC 分页 part1
    怎么做好一个美食排行榜的用户投票功能?
    「要买车网」免费获取汽车电商要买车网购车优惠券
    MVC Ajax Form & Ajax Valida(笔记)
    C# 序列化高级用法
    我与葡萄城的故事
    生成分布式随机ID
  • 原文地址:https://www.cnblogs.com/lz0925/p/7493393.html
Copyright © 2011-2022 走看看