本帖最后由 sky94132003 于 2014-08-24 03:53:35 编辑

解决方案 »

  1.   

    暂时用了这一段代码,感觉有点蠢有什么更好的方法建议呢?//相关文章
    if (!empty($data["tags"]) || !empty($data["lid"])) {
    $tags = $data["tags"];
    $lid = $data["lid"];
    $tag_sql = "SELECT * FROM `content` WHERE `tags` IN ($tags) OR `lid` IN ($lid) ORDER BY `time` DESC LIMIT 8";
    $stmt = $pdo->prepare($tag_sql);
    $stmt->execute();
    $tags_v = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $smarty -> assign("r_v",$tags_v);
    }
    $tags_num = count($tags_v);
    if ($tags_num < 8 ) {
    $now_v = "";
    foreach ($tags_v as $key => $value) {  
    $now_v .= $value['vid'].",";
    }
    $now_v=substr("$now_v",0,-1);
    $need = 8-$tags_num;
    $typeid = $data["typeid"];
    $typeid_sql = "SELECT * FROM `content` WHERE `typeid` = '$typeid' AND  `vid` NOT IN ($now_v) ORDER BY `time` DESC LIMIT $need";
    $stmt = $pdo->prepare($typeid_sql);
    $stmt->execute();
    $typeid_v = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $smarty -> assign("r_tv",$typeid_v);
    }
      

  2.   

    sql用or、not in本来就不好;
    如果数据不需要太及时的话
    把你3条sql语句组合好的数据缓存一段时间(半小时、一小时、甚至再长一点也可以)
    因为你的数据都是死数据,没有浏览量,评论量等等
      

  3.   

    谢谢
    这个我也了解但更想知道的是,如果按照更有关的排得更前就是先排TAG 再排LID  最后再排同类其他文章莫非只能用二楼的方法?
      

  4.   

    你的 意思是不是如果要10条tag,就先取10条tag,不够再取有lib,接着不够再取有type的?如果是这样的话, 你的sql是不是会有问题!
      

  5.   

    是的2楼暂时做了个简单的
    暂时先不分tag和lid不够再取type
    以及2楼用8条做测试是否有更好的做法?