Mysql 如何基于带有两个表的标记查询相关文章?
我在这个场景中使用了三个表:articles、tags和article_标记。为了管理标签,我使用了一个单独的标签表。article_tags表将文章链接到标记。因此,表格如下所示:Mysql 如何基于带有两个表的标记查询相关文章?,mysql,Mysql,我在这个场景中使用了三个表:articles、tags和article_标记。为了管理标签,我使用了一个单独的标签表。article_tags表将文章链接到标记。因此,表格如下所示: articles: |-------------------| |--article_id(int)--| |-------------------| tags |-------------------| |---tag_id(int)-----| |--keyword(varchar)-| |---------
articles:
|-------------------|
|--article_id(int)--|
|-------------------|
tags
|-------------------|
|---tag_id(int)-----|
|--keyword(varchar)-|
|-------------------|
article_tags
|-------------------|
|-article_tag_id(int)|
|-article_id(int)---|
|----tag_id(int)----|
|-------------------|
因此,我希望获取具有最常见标记的文章,并按匹配项对结果进行排序。我该怎么做
这是我在仅使用一个表作为标记时使用的查询
SELECT t2.article_id, count(t2.keyword) AS matches,
a.article_id AS related_id
FROM article_tags t1
JOIN article_tags t2 ON (t1.keyword = t2.keyword AND t1.article_id != t2.article_id)
JOIN articles a on (t2.article_id = a.article_id)
WHERE t1.article_id = ".$article_id."
GROUP BY t2.article_id
ORDER BY matches DESC
LIMIT 5
考虑模式。。。如果查看文章id 1,则结果中将包括第2条和第3条,但是,第3条将显示在第2条之前,因为第2条与正在查看的文章有更多相同的标记第1条。如果我理解正确,您的查询应该是这样的
SELECT t2.article_id, COUNT(t2.tag_id) AS matches
FROM (SELECT article_id, tag_id
FROM article_tags
WHERE article_id = 1) t1
INNER JOIN (SELECT article_id, tag_id
FROM article_tags
WHERE article_id != 1) t2
ON t1.tag_id = t2.tag_id
GROUP BY t2.article_id
ORDER BY matches DESC
LIMIT 5;
第一个子查询t1选择文章id我认为这是没有必要的,你只能选择标签id和标签id来查看文章
第二个子查询t2为所有其他文章选择文章id和标签id
然后,我们基于两个子查询中的tag_id进行简单的内部联接。这将从t2中排除所有与第一个表中的tag_id不匹配的tag_id
在此之后,我们只是分组和订购计数标签
下面是看看它是如何工作的
德国劳埃德船级社 您确定此查询正确吗?article_tags表没有关键字列。提供一些示例输出对于那些试图解决您的问题的人来说是非常宝贵的。我提供的查询是我在分离tags表之前使用的一个示例。我使用article_tags表将tags表链接到articles表。蒂姆,我会说的。标签是做什么的?没有什么摆脱它。它只是链接的自动增量。我还更新了问题,添加了一个指向SQLFiddle示例的链接。