好吧,这对我来说是一个令人头疼的问题。我有一个带有标签的帖子系统。标签与帖子是多->多关系。
问题是我想根据与当前帖子匹配的标签数量来选择其他帖子。
一个快速的视觉示例:
PostA: TagA, TagB
PostB: TagC
PostC: TagA
PostD: TagA, TagB
所以如果我输入 PostA,它会给我 PostD,PostC。
我真的不知道从哪里开始,我希望比我更聪明的人已经遇到了这个问题并且可以提供一些帮助。
好吧,这对我来说是一个令人头疼的问题。我有一个带有标签的帖子系统。标签与帖子是多->多关系。
问题是我想根据与当前帖子匹配的标签数量来选择其他帖子。
一个快速的视觉示例:
PostA: TagA, TagB
PostB: TagC
PostC: TagA
PostD: TagA, TagB
所以如果我输入 PostA,它会给我 PostD,PostC。
我真的不知道从哪里开始,我希望比我更聪明的人已经遇到了这个问题并且可以提供一些帮助。
好的,假设您的 tagged posts 表实际上如下所示:
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
");