「相关文章」结果是越相关排名越前的案例,求一个高效的写法
程序员文章站
2022-05-21 15:10:16
...
我的文章系统,想按照多个件条下
,看看有什么可能性可做到
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%的部分是显示相关文章,所以在营运上很重要
这个我也了解
但更想知道的是,如果按照更有关的排得更前
就是先排TAG 再排LID 最后再排同类其他文章
莫非只能用二楼的方法?
是的
2楼暂时做了个简单的
暂时先不分tag和lid
不够再取type
以及2楼用8条做测试
是否有更好的做法?
,看看有什么可能性可做到
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%的部分是显示相关文章,所以在营运上很重要
回复讨论(解决方案)
暂时用了这一段代码,感觉有点蠢
有什么更好的方法建议呢?
//相关文章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 $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条做测试
是否有更好的做法?
用全文检索来做