那麼這個人對我來說是一個頭疼的人。我有一個帶有標籤的帖子系統。標籤與帖子有很多關係。MySQL得到哪裏有很多很多比賽?
問題是,我想根據他們與當前匹配的標籤數來選擇其他帖子。
的快速可視例如:
PostA: TagA, TagB
PostB: TagC
PostC: TagA
PostD: TagA, TagB
所以,如果我輸入波斯塔,這將會給我PostD,POSTC。
我真的不知道該從哪裏開始,我希望有人比我遇到這個問題更聰明,並且可以提供一些幫助。
那麼這個人對我來說是一個頭疼的人。我有一個帶有標籤的帖子系統。標籤與帖子有很多關係。MySQL得到哪裏有很多很多比賽?
問題是,我想根據他們與當前匹配的標籤數來選擇其他帖子。
的快速可視例如:
PostA: TagA, TagB
PostB: TagC
PostC: TagA
PostD: TagA, TagB
所以,如果我輸入波斯塔,這將會給我PostD,POSTC。
我真的不知道該從哪裏開始,我希望有人比我遇到這個問題更聰明,並且可以提供一些幫助。
好了,假設你的標籤的帖子表實際上是這樣的:
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
這裏是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
");
非常好,簡單的解決方案。 – Hogan 2012-07-13 23:37:54
這是完美的,我不得不做一些修改,讓它在wordpress中工作(我會張貼他們作爲任何人可能需要一個wordpress版本的答案)。再次感謝!現在要弄清楚如何從前20名中隨機選擇其中的6個,我只會在php中這樣做。 – Ben 2012-07-14 00:06:53
@mazzzzz在查詢的末尾添加「LIMIT 6」。 – bfavaretto 2012-07-14 00:10:00