免责声明:我使用 MySQL 和 2 个表。到目前为止,当使用 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
文章词
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 个单词的 WordGroups,但它非常精确且不可扩展,此查询需要适用于任何大小的 WordGroup 才可行。
感谢阅读!
最佳答案
这是一种方法,使用 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 fiddle 。
关于mysql - 对于一个表中的每组关键字,在第二个表中查找所有匹配的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51810098/