「相關文章」結果是越相關排名越前的案例,求一個高效的寫法

來源:互聯網
上載者:User
我的文章系統,想按照多個件條下
,看看有什麼可能性可做到

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 < 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條做測試

是否有更好的做法?

用全文檢索索引來做

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.