当前位置: 首页 > 面试题库 >

MySQL查找相关文章

常飞翼
2023-03-14
问题内容

我试图选择最多10条相关文章,其中相关文章是与其他文章具有3个或更多相同关键字的文章。

我的表结构如下:

articles[id, title, content, time]
tags[id, tag]
articles_tags[article_id, tag_id]

我可以在一个查询中选择所有相关的文章ID和标题吗?

任何帮助是极大的赞赏。


问题答案:

假设标题也是唯一的

SELECT fA.ID, fA.Title
from
   Articles bA,
   articles_tags bAT,
   articles_tags fAT,
   Articles fA
where 
   bA.title = "some name"   AND
   bA.id = bAT.Article_Id   AND
   bAT.Tag_ID = fAT.Tag_ID    AND
   fAT.Article_ID = fA.ID  AND
   fA.title != 'some name'
GROUP BY 
    fA.ID, fA.Title
HAVING
   count(*) >= 3

在何处排除“种子”文章

因为我并不在乎我匹配哪个标签,而只是在3个标签上匹配,所以我只需要tag_id并完全避免连接到标签表。因此,现在我将多对多表与其自身相连,以查找具有重叠部分的文章。

问题是该文章将100%匹配到自己,因此我们需要从结果中消除它。

您可以通过3种方式排除该记录。您可以将其从表中筛选到联接之前,可以使其脱离联接,也可以在完成后对其进行筛选。

如果在开始加入之前将其消除,则不会获得太多优势。您有成千上万的文章,而您只消除了1。我还认为,基于article_tag映射表的最佳索引,这将无用。

如果将其作为连接的一部分进行,则不等式将阻止该子句成为索引扫描的一部分,并在索引扫描之后用作过滤器。

将article_tags上的索引视为(Tag_ID,Article_ID)。如果我在tag_id =
tag_id上将索引与其自身相连,那么我将通过将索引移至我的“种子”文章所具有的每个tag_id来立即定义要处理的索引切片。如果添加子句article_id!=
article_id,则无法使用索引来定义要处理的切片。这意味着它将被用作过滤器。例如,说我的第一个标签是“蓝色”。我浏览索引以获取所有具有“蓝色”的文章。(当然是通过ID)。假设有50行。我们知道1是我的种子文章,49是匹配项。如果我不包括不等式,那么我将包括所有50条记录并继续前进。如果确实包含不等式,则必须检查50条记录中的每条记录,以查看哪些是我的种子,哪些不是我的种子。下一个标签是“木星”,它匹配20,000条。再次,我必须检查索引的该切片中的每一行以排除我的种子文章。在经历了2,5,20次(取决于该种子文章的标签)之后,我现在有了一组完全干净的文章来进行COUNT(*)和HAVING处理。如果我不将不等式作为连接的一部分,而只是将SEED
ID过滤掉,然后通过分组,那么我仅在很短的列表中执行一次该过滤器。




 类似资料:
  • 问题内容: 我有两个表:“电影”和“用户”。两者之间存在n:m关系,描述用户观看过哪些电影。这用表格“ seen”描述。现在,我想为给定的用户找出他尚未看过的所有电影。我当前的解决方案是这样的: 这可以正常工作,但扩展性似乎不太好。有更好的方法吗? 问题答案: 这是不使用您显示的子查询方法来执行此查询的典型方法。这可以满足@Godeke的要求,以查看基于联接的解决方案。 但是,在大多数品牌的数据库

  • 比如Activity 绑定了xml,可以使用此功能快速跳转到绑定的xml 操作步骤: 菜单栏: Navigate —> Related Symbol 快捷键: Mac: control + command + ↑ Windows\/Linux: Ctrl + Alt + Home

  • find 命令 sudo find /usr/local/nginx -name nginx.conf #在 /usr/local/nginx 下查找 nginx.conf 文件 sudo find /usr/local/nginx -iname nginx.conf #在 /usr/local/nginx 下查找 nginx.conf 文件,忽略文件名称大小写 sudo find /home

  • 这是关于cppreference的描述。com说 模板中使用的依赖名称的查找将推迟到模板参数已知时,此时[…]ADL检查从模板定义上下文或模板实例化上下文可见的具有外部链接的函数声明。 与此相反,以下代码段可以使用三个编译器(MSVC、clang、gcc)很好地编译: Foo是CallFoo中的从属名称:它取决于模板参数T。但是,尽管违反了上述两条规则,编译器还是找到了函数Foo。 从的定义或实例

  • 问题内容: 我很好奇为何应该比更快地执行。 当比尔·卡尔文提出一个要点时,我正在回答一个问题。当您使用它时,它使用相关子查询(依赖子查询),而IN()仅使用子查询。 解释显示,并且两者都使用了一个依赖子查询,并且都只使用了一个子查询..所以我很好奇关联子查询如何比子查询更快? 我以前使用过EXISTS,它的执行速度比IN快,这就是我感到困惑的原因。 这是带有说明的SQLFIDDLE 一些问题 在上

  • 仅使用一个组合查找表(mySQL数据库)来存储表之间的“链接”比使用单独的查找表有大的缺点(可能在查询速度等方面)吗?我之所以这么问,是因为在我的项目场景中,我最终会得到超过100个单独的查找表,我认为设置和维护这些表将会有很多工作。但为了更简单地举例,这里是一个仅包含4个表的简化场景: 表:教师 表:学生 表:类 表:languageSpoken ========================