MySQL有很多匹配的地方?

时间:2012-07-13 23:18:41

标签: php mysql sql many-to-many

这个人对我来说是一个头脑风暴。我有一个带标签的帖子系统。标签与帖子有很多很多关系。

问题在于,我想根据与当前帖子匹配的标签数量来选择其他帖子。

一个快速的视觉示例:

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

所以,如果我输入PostA,它会给我PostD,PostC。

我真的不知道从哪里开始这个,我希望有人比我遇到这个问题更聪明,并且可以提供一些帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
");