这是一个复杂的情况(对我来说),我希望有人可以帮助我。我已经做了大量的搜索解决方案而无法找到解决方案。这基本上就是我的情况......(我已将其修剪下来,因为如果有人可以帮助我创建此查询,我可以从那里开始。)
表文章(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)
真的很感激任何帮助!谢谢!
答案 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语法。