「相关文章」结果是越相关排名越前的案例,求一个高效的写法

php中文网
发布: 2016-06-23 13:50:49
原创
801人浏览过

我的文章系统,想按照多个件条下
,看看有什么可能性可做到

4张表  基础简介
content 文章主表
id
lid = 相关的文集id ,保存格式 (1,2,3)
tags = 相关的TAG 的ID   ,保存格式 (1,2,3)
typeid = 分类ID 只为1个数字 
文集
lid
name

Tags
id
name
分类
typeid
name

typeid = 分类ID, 不别多说
tag = 标签这不用多说,
lid = 一个文集, 但一篇文章可以放到多个文集, 比如: PHP+MYSQL+AJAX无刷新评论
用户可能放到  PHP文集,MYSQL文章,AJAX文集

TAG 是全站共用,重复就不新增,只会选择  
所以不能做成一个自己文章的分类列表,所以会出现了文集功能


因为文章某个部分已经会显示当前文集其他的文章

所以在关相文章的部分,文集中的文件不比TAG文章更应该排在前面

所以准备的关系排名是
1. TAG相关
2. 文集
3. 最新的当前分类文章

为什么要分3次???

因为我就是怕太TAG,同时又没有用到文集功能....
所以最后一步才是当前分类文章



当前文章的
TAG 是3,14
lid = 7,12
typeid = 2

SELECT * FROM `content` WHERE `tags` IN (3,14) ORDER BY `time` DESC LIMIT 10
SELECT * FROM `content` WHERE `lid` IN (7,12) ORDER BY `time` DESC LIMIT 10
SELECT * FROM `content` WHERE `typeid` = '2' ORDER BY `time` DESC LIMIT 10


前台显示十条相关文章
本来是准备,分3次,然后每次拿10条是最安全的

后来想想...这样还有合并数组什么的也麻烦,重点是取太多资料,但前台只需要10条

所以换成一句
SELECT * FROM `video_content` WHERE `tags` IN (3,14) or `lid` IN (3) or `typeid` = 2  LIMIT 10

但这样好像又能以TAG>文集>分类...去排名

请求一下有何方法?

要求好像蛮麻烦的呵呵,因为页面下半部有50%的部分是显示相关文章,所以在营运上很重要

通义万相
通义万相

通义万相,一个不断进化的AI艺术创作大模型

通义万相 596
查看详情 通义万相

回复讨论(解决方案)

暂时用了这一段代码,感觉有点蠢

有什么更好的方法建议呢?

//相关文章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);}
登录后复制

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

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

谢谢
这个我也了解

但更想知道的是,如果按照更有关的排得更前

就是先排TAG 再排LID  最后再排同类其他文章

莫非只能用二楼的方法?

你的 意思是不是如果要10条tag,就先取10条tag,不够再取有lib,接着不够再取有type的?

如果是这样的话, 你的sql是不是会有问题!

你的 意思是不是如果要10条tag,就先取10条tag,不够再取有lib,接着不够再取有type的?

如果是这样的话, 你的sql是不是会有问题!


是的

2楼暂时做了个简单的
暂时先不分tag和lid

不够再取type
以及2楼用8条做测试

是否有更好的做法?

用全文检索来做

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号