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

t2a7ltrp  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(209)

免责声明:我将mysql与两个表一起使用。到目前为止,我已经找到了解决问题的方法,即使用in()一次查询一个组,但没有任何方法可以让我一次完成整个表,而不必循环多次查询。
我有两张table:

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

它跟踪关键字组、单词到组ID以及

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

文章词

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个字,但它是非常准确,不可扩展的,这个查询将需要为任何大小的字组是可行的。
谢谢你的阅读!

vd2z7a6w

vd2z7a6w1#

这里有一个方法,使用 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;

这是一个sql小提琴。

相关问题