如何创建MySQL查询以从多个表中查找相关帖子?

时间:2010-03-23 02:46:59

标签: mysql sql

这是一个复杂的情况(对我来说),我希望有人可以帮助我。我已经做了大量的搜索解决方案而无法找到解决方案。这基本上就是我的情况......(我已将其修剪下来,因为如果有人可以帮助我创建此查询,我可以从那里开始。)

表文章(article_id,article_title)

表articles_tags(row_id,article_id,tag_id)

TABLE article_categories(row_id,article_id,category_id)

所有表都有article_id的共同点。我知道所有tag_id和category_id行都是什么。我想要做的是返回article_tags和article_categories可能共有的所有文章的列表,按公共条目的数量排序。

例如:

article1 - tags:tag1,tag2,tag3 - categories:cat1,cat2

article2 - tags:tag2 - categories:cat1,cat2

article3 - tags:tag1,tag3 - categories:cat1

因此,如果我的文章有“tag1”和“cat1 and cat2”,那么它应按此顺序返回文章:

第1条(共同的tag1,cat1和cat2)

第3条(tag1,共同的cat1)

第2条(共同的cat1)

真的很感激任何帮助!谢谢!

2 个答案:

答案 0 :(得分:2)

如果你只有标签表(不是类别表),这是一个更优化的开始:

SELECT article_id,count(*) AS q 
FROM article_tags 
WHERE id_tag IN (
    SELECT id_tag 
    FROM article_tags 
    WHERE article_id=41
) 
AND article_id!=41 
GROUP BY article_id 
ORDER BY q DESC

答案 1 :(得分:1)

好的,这是我的初稿:

 SELECT article_id, count(*) as common_term_count FROM 
      (
      SELECT article_id FROM tags WHERE tag IN 
         (SELECT tag FROM tags WHERE article_id = :YourArticle)
      UNION ALL 
      SELECT article_id FROM categories WHERE category IN
         (SELECT category FROM categories WHERE article_id = :YourArticle)
       ) AS accumulator_table 
 GROUP BY article_id ORDER common_term_count DESC

我认为这是有效的MySQL语法。