### [最实用帝国CMS跨表查询相关链接实现方法](https://www.prosaas.cn/article/3529) **Published:** 2019-11-29T06:04:31 **Author:** 5201314 **Excerpt:** 本文实例讲述了帝国CMS跨表查询相关链接实现方法。分享给大家供大家参考。具体分析如下:官方的相关链接不灵活,样… ![](//zhiqipro.oss-cn-beijing.aliyuncs.com/2023/12/20231212121953454.gif) 本文实例讲述了帝国CMS跨表查询相关链接实现方法。分享给大家供大家参考。具体分析如下: 官方的相关链接不灵活,样式不能任意的修改且无法跨表,很多人想跨表做相关链接,比如news和info都有几篇文章,关键词都有'北京',那么如何调用这些有有同一关键词的文章呢?为此写了一个自定义函数. 推荐学习《帝国cms教程》 小范围的调用于本分类,稍大一点范围可以调用同一表的文章,再大一点可以调用指定的表的文章,可以选要调用文章的数量,其实还可以升级,比如指定调用某个表的文章数量,那个表的顺序等,函数没有样式,稍微懂一点代码的可以自行修改,其实不是特别难,如果有哪位升级了这个函数,可以共享给大家. 代码如下: fetch1("select tagid,tagname,num,isgood,cid from {$dbtbpre}enewstags where tagname='". $tag\_all\[$i\]."' order by tagid limit 1") ; $tag\_id\[$i\]=$r\_1\_1\['tagid'\] ; //tag的ID $tag\_num\[$i\]=$r\_1\_1\['num'\] ; //tag下的文章数量 if($tag\_num\[$i\]>=$eq\_num){//如果TAG下的文章数量比平均的数量大或者等于,那么TAG的文章数量取平均值 $tag\_num\[$i\] = $eq\_num ;//重新赋值 }else{//如果TAG下的文章小于平均值,那么TAG取原有的文章数量。同时重新赋值平均值。 $eg\_tag= $eq\_num-$tag\_num\[$i\] ; $eq\_num += $eg\_tag ; } //比如说有3个TAG,每个TAG下有4篇文章,现在指定要显示10篇文章,那么每个TAG要拿出4篇,共有12篇文章 //3个TAG,每个TAG下有3篇文章,现在指定要显示10篇文章,那么每个TAG要拿出3篇文章,共有9篇文章 //3个TAG,A有2篇文章,B有5篇文章,C有3篇文章,现在要显示10篇文章,那么A拿出2篇文章,B拿出5篇文章,C拿出3篇文章, 共有10篇文章 //如果 A、B、C中除了当前文章,还有相同的文章,那么会扣除重复的那篇文章,只取一次。所以指定的数量会有偏差 for($i\_n=0;$i\_nquery("select tid,classid,id,mid from {$dbtbpre}enewstagsdata where tagid='".$tag\_id\[$i\]."' order by classid "); $ri=1 ; while($r=$empire->fetch($sql)) { $tbname\_all\[$r\['tid'\]\]=$class\_r\[$r\['classid'\]\]\['tbname'\] ; if($tbname\_all\[$r\['tid'\]\]==$tbname\_num\[$i\_n\] && $ri <= $tag\_num\[$i\] && $navinfor\['classid'\]!=$r\['classid'\] && $navinfor\['id'\]!=$r\['id'\]){ if($ck==1&&$navinfor\['classid'\]==$r\['classid'\]){ $tbname\_all\_r\[$r\['tid'\]\]=$class\_r\[$r\['classid'\]\]\['tbname'\] ; $classid\_id\[$r\['tid'\]\]=$r\['classid'\] . '\_' . $r\['id'\] ; $classid\_all\[$r\['tid'\]\]=$r\['classid'\] ; $id\_all\[$r\['tid'\]\]\[$r\['classid'\]\]=$r\['id'\] ; }elseif($ck==2&&$class\_r\[$navinfor\['classid'\]\]\['tbname'\]==$class\_r\[$r\['classid'\]\]\['tbname'\]){ $tbname\_all\_r\[$r\['tid'\]\]=$class\_r\[$r\['classid'\]\]\['tbname'\] ; $classid\_id\[$r\['tid'\]\]=$r\['classid'\] . '\_' . $r\['id'\] ; $classid\_all\[$r\['tid'\]\]=$r\['classid'\] ; $id\_all\[$r\['tid'\]\]\[$r\['classid'\]\]=$r\['id'\] ; }elseif($ck==3){ $tbname\_all\_r\[$r\['tid'\]\]=$class\_r\[$r\['classid'\]\]\['tbname'\] ; $classid\_id\[$r\['tid'\]\]=$r\['classid'\] . '\_' . $r\['id'\] ; $classid\_all\[$r\['tid'\]\]=$r\['classid'\] ; $id\_all\[$r\['tid'\]\]\[$r\['classid'\]\]=$r\['id'\] ; } $ri++; } } } } $classid\_id\_x=array\_unique($classid\_id);//去除重复的值 //去除重复的值,不同的TAG会有相同的文章。所以去除重复的值。比如A篇文章里面都有"北京","奥运",两个关键词, B篇文章里面也有"北京","奥运"在不去除重复的情况下,A篇的相关链接会出现两次B文章。所以必须去除其中一个。 arsort($classid\_id\_x); //按键名排列,倒序 $tid\_tid=array\_keys($classid\_id\_x) ;//取出键名重新排列,键名即为TAG的ID:tid shuffle($tid\_tid);//顺序打乱,重新排 $tid\_tid\_num=count($tid\_tid) ; if($num<$tid\_tid\_num) $tid\_tid\_num=$num+1 ;//由于去除了本文章,所以再加一条弥补 for($i\_tid=0;$i\_tid<$tid\_tid\_num;$i\_tid++){ $tid=$tid\_tid\[$i\_tid\]; $classid=$classid\_all\[$tid\]; $id=$id\_all\[$tid\]\[$classid\]; if($id==$navinfor\['id'\]) continue ; //如果是本文章,相关链接里面就不用再放了。 $tbname=$tbname\_all\_r\[$tid\]; $r\_1\_2 =$empire->fetch1("select title,smalltext,titleurl,dp\_jt,dp\_dwz from {$dbtbpre}ecms\_$tbname where id='".$id."' order by newstime limit 1") ; ////////显示样式在这修改 echo $r\_1\_2\['title'\].' ' ; //////// } } ?> /\*\* \*\*/ 希望本文所述对大家的帝国CMS建站有所帮助。 以上就是最实用帝国CMS跨表查询相关链接实现方法的详细内容,更多请关注知企PROSAAS其它相关文章! **Tags:** cms, 帝国CMS **Categories:** 帝国CMS ---