对于一个表中的每组关键字,请在第二个表中找到所有匹配的匹配

时间:2018-08-12 15:10:39

标签: mysql sql database performance search

免责声明:我正在使用带有2个表的MySQL。到目前为止,当我使用IN()一次查询单个组时,我已经找到了解决问题的方法,但是没有什么可以让我一次完成整个表而不循环多个查询。

我有两个表:

CREATE TABLE WordGroups (
  wgId int NOT NULL AUTO_INCREMENT,
  groupId int NOT NULL,
  word varchar(255) NOT NULL,
  PRIMARY KEY (wgId)
);

跟踪哪些关键字组,单词到groupId以及

CREATE TABLE ArticleWords (
  awId int NOT NULL AUTO_INCREMENT,
  articleId int NOT NULL,
  word varchar(255) NOT NULL,
  PRIMARY KEY (awId)
);

可跟踪文章中的关键字。

我正在尝试构建一个查询,以获取单词组,并为每个组返回包含至少所有这些单词的所有文章。

我意识到,如果我一次在单个查询中寻找一组,这非常简单,但是我似乎无法弄清楚如何在所有匹配子集的集合中进行单个查询。

例如,假设两个表具有以下数据:

单词组

groupId   |  word
-----------------
1         |  B
1         |  A
2         |  C
2         |  E
3         |  F

ArticleWords

articleId |  word
-----------------
1         |  A
1         |  C
1         |  B
2         |  C
3         |  A
3         |  B
3         |  F
4         |  C
4         |  E
4         |  F

结果查询将返回:

groupId | articleId
1       | 1
1       | 3
2       | 4
3       | 3
3       | 4

由于这些文章至少包含这些组中的所有单词。

我尝试使用内部联接对两个表进行相交,但是匹配不完整的单词组,从而导致该行:

groupId | articleId
2       | 2

所有出现在结果中的原因是第2条包含单词“ C”。当我涉足不太认真的MySQL时,我很乐于接受想法,但这整个星期都使我难以理解。

非常感谢您的帮助。我正想知道是否要使SQL进行本不应该做的事情。我有一个非常长的查询,适用于最多6个单词的WordGroup,但是它非常准确且不可扩展,该查询需要适用于任何大小的WordGroup才能实现。

感谢您的阅读!

1 个答案:

答案 0 :(得分:0)

这是一种方法,使用group_concat()进行比较:

select wg.groupId, aw.articleId
from articlewords aw join
     wordgroups wg
     on wg.word = aw.word join
     (select wg.groupId, group_concat(wg.word order by word) as words
      from word_groups wg
      group by wg.groupId
     ) wgw
     on wgw.groupId = wg.groupid
group by aw.articleid, wgw.words
having group_concat(aw.word order by aw.word) = wgw.words;

Here是一个SQL提琴。