2012-07-13 53 views
1

那麼這個人對我來說是一個頭疼的人。我有一個帶有標籤的帖子系統。標籤與帖子有很多關係。MySQL得到哪裏有很多很多比賽?

問題是,我想根據他們與當前匹配的標籤數來選擇其他帖子。

的快速可視例如:

PostA: TagA, TagB 
PostB: TagC 
PostC: TagA 
PostD: TagA, TagB 

所以,如果我輸入波斯塔,這將會給我PostD,POSTC。

我真的不知道該從哪裏開始,我希望有人比我遇到這個問題更聰明,並且可以提供一些幫助。

回答

5

好了,假設你的標籤的帖子表實際上是這樣的:

PostA TagA 
PostA TagB 
PostB TagC 
PostC TagA 
PostD TagA 
PostD TagB 

那麼你要

SELECT post FROM tagged_posts 
    WHERE post != 'PostA' 
    AND tag in (SELECT tag FROM tagged_posts WHERE post = 'PostA') 
    GROUP BY post 
    ORDER BY COUNT(*) desc 
+0

非常好,簡單的解決方案。 – Hogan 2012-07-13 23:37:54

+0

這是完美的,我不得不做一些修改,讓它在wordpress中工作(我會張貼他們作爲任何人可能需要一個wordpress版本的答案)。再次感謝!現在要弄清楚如何從前20名中隨機選擇其中的6個,我只會在php中這樣做。 – Ben 2012-07-14 00:06:53

+1

@mazzzzz在查詢的末尾添加「LIMIT 6」。 – bfavaretto 2012-07-14 00:10:00

0

這裏是WordPress的版本,如果有人有興趣。它使用標籤(但可以輕鬆修改類別)。希望它也能幫助其他人。

注意:需要兩個變量,$ wpdb類(如果在函數中調用時需要全局化)和$ post-> ID(通過調用the_post()自動設置)但其他情況需要手動設置。

$query = $wpdb->get_results(" 
SELECT posts.* 
FROM {$wpdb->term_relationships} as relate 
LEFT JOIN {$wpdb->term_taxonomy} as taxonomy 
    ON relate.term_taxonomy_id = taxonomy.term_taxonomy_id 
LEFT JOIN {$wpdb->terms} as terms 
    ON taxonomy.term_id = terms.term_id 
LEFT JOIN {$wpdb->posts} as posts 
    ON posts.ID = object_id 
WHERE object_id != '{$post->ID}' 
    AND taxonomy = 'post_tag' 
    AND taxonomy.term_id in 
     (
      SELECT term_id 
      FROM {$wpdb->term_relationships} as relate 
      LEFT JOIN {$wpdb->term_taxonomy} as taxonomy 
       ON relate.term_taxonomy_id = taxonomy.term_taxonomy_id 
      WHERE object_id = '{$post->ID}' 
     ) 
GROUP BY object_id 
ORDER BY COUNT(*) desc 
");